我可以期待Dalvik和Android工具链的哪些优化?
我正在开发一个高性能的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
诸如此类。。。