我正在开发一个高性能的Android应用程序(游戏),尽管我首先尝试编写代码以提高可读性,但我还是想在脑海中默默地了解引擎盖下正在发生的事情。使用C ++,我对编译器将为我做什么和不为我做什么有了很好的直觉。我正在尝试对Java / Android执行相同的操作。
因此,这个问题。我在网络上找不到关于该主题的信息。Java编译器,Dalvik转换器(dx)和/或JITter(在Android 2.2+上)是否会执行以下优化?
方法内联。在什么条件下?
private
始终可以安全地内联方法;会完成吗?public final
方法怎么样?其他类的对象上的方法?static
方法?如果编译器可以轻松推断出对象的运行时类型怎么办?我应该声明方法final
还是static
尽可能声明方法?常见子表达式消除。例如,如果我访问
someObject.someField
两次,查找将仅执行一次吗?如果是给吸气剂打电话怎么办?如果我两次使用算术表达式怎么办?只会评估一次吗?如果我使用某个表达式的结果作为for
循环的上限,该表达式的值我不知道会改变怎么办?边界检查数组查找。工具链会在某些情况下(例如原型
for
循环)消除这种情况吗?价值内联。是否
public static final int
总是会内联访问某些内容?即使他们在另一个班上?即使他们在另一个包裹中?分支预测。这甚至有多大的问题?在典型的Android设备上分支性能是否受到重大影响?
简单的算术。会
someInt * 2
被取代someInt << 1
吗?
Etcetera ...