【发布时间】:2011-06-22 05:05:52
【问题描述】:
我正在开发一个高性能的 Android 应用程序(一个游戏),尽管我首先尝试编写代码以提高可读性,但我喜欢在脑海中保留一个幕后发生的事情的画面。使用 C++,我对编译器将为我做什么和不做什么有了相当好的直觉。我正在尝试为 Java/Android 做同样的事情。
因此提出了这个问题。我在网上几乎找不到关于这个话题的信息。 Java 编译器、Dalvik 转换器 (dx) 和/或 JITter(在 Android 2.2+ 上)会执行如下优化吗?
方法内联。在什么条件下?
private方法总是可以安全地内联;这会完成吗?public final方法怎么样?其他类对象的方法?static方法?如果编译器可以轻松推断出对象的运行时类型怎么办?我应该尽可能将方法声明为final或static吗?通用子表达式消除。例如,如果我访问
someObject.someField两次,是否只进行一次查找?如果是对 getter 的调用呢?如果我两次使用某个算术表达式怎么办?它只会被评估一次吗?如果我使用某个表达式的结果(我知道它的值不会改变)作为for循环的上限呢?对数组查找进行边界检查。工具链会在某些情况下消除这种情况,例如典型的
for循环吗?值内联。对某些
public static final int的访问是否总是被内联?即使他们在另一个班级?即使它们在另一个包中?分支预测。这是一个多大的问题?分支对典型 Android 设备的性能影响很大吗?
简单的算术。
someInt * 2会被someInt << 1取代吗?
等等……
【问题讨论】:
-
@pablochan:那个在我枕头下已经有一段时间了,但是谢谢 :) @Lior:很好的参考资料,这些对我来说是新的,谢谢!
-
"someInt * 2" 和 "someInt
-
D'oh,谢谢 :) (即便如此,它们在 Java 中的语义可能略有不同 w.r.t. 溢出或负数?不知道,从未检查过......)
标签: java android optimization dalvik