我习惯于Joshua Bloch的Effective Java给出的建议Item 52: Refer to objects by their interfaces.
但是,在Android的大多数示例代码中,我意识到以下代码非常常见.
private ArrayList<Integer> mPhotos = new ArrayList<Integer>();
Run Code Online (Sandbox Code Playgroud)
我理解这是由于性能优化的目的,因为下面的代码会更慢.
private List<Integer> mPhotos = new ArrayList<Integer>();
Run Code Online (Sandbox Code Playgroud)
但是,这种优化技术仍然有效吗?好像我从http://developer.android.com/guide/practices/design/performance.html上读到
在没有JIT的设备上,通过具有精确类型而不是接口的变量调用方法确实更有效.(例如,调用HashMap映射上的方法比使用Map映射更便宜,即使在这两种情况下映射都是HashMap.)情况并非如此慢2倍; 实际差异更像是慢了6%.此外,JIT使两者有效地难以区分.
我们是否需要假设我们的设备没有JIT,并且引用没有接口的对象?或者,我们应该接受Joshua Bloch的建议吗?
从 Android 2.2 开始,Dalvik VM(运行由 Java 源代码生成的 Dalvik 字节码)具有即时编译器 (JIT)。
我不知道这个特定的优化是否是 JIT 的一部分,但它应该可以在实际设备上进行测试。
如果您的目标是 2.2 之前的设备,并且调用中的 6% 开销(不要与应用程序总体 6% 的速度下降混淆!)对您的应用程序产生严重影响,那么这种优化可能是值得的。
| 归档时间: |
|
| 查看次数: |
203 次 |
| 最近记录: |