我正在开发一个高性能的 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
吗?
等等...