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