【发布时间】:2011-01-27 22:52:40
【问题描述】:
为 android 设备开发游戏,我需要针对完全没有 JIT 并且只依赖字节码优化的设备。我想知道这些优化的集合是不是空的……
实际上,java 编译器(硬编译器,javac,而不是 JIT)是否进行了任何优化,例如将 a / 4 转换为 a >> 2 ?还是每次优化都是 JIT 的工作?
【问题讨论】:
-
除法与左移对整体程序速度没有任何影响。一点都没有。
为 android 设备开发游戏,我需要针对完全没有 JIT 并且只依赖字节码优化的设备。我想知道这些优化的集合是不是空的……
实际上,java 编译器(硬编译器,javac,而不是 JIT)是否进行了任何优化,例如将 a / 4 转换为 a >> 2 ?还是每次优化都是 JIT 的工作?
【问题讨论】:
标准 Java 编译器会进行一些优化,但将大部分优化留给 JIT。
JIT 知道程序究竟在哪个处理器上运行,并且还可以访问运行时信息,因此它可以比 Java 编译器提前做更多的优化。此外,提前进行大量优化可能会在一定程度上“混淆”字节码,使 JIT 更难对其进行优化。
我不知道 Google 的编译器在将您的 Java 字节码转换为 Dalvik 代码时会做什么 - 它可能会进行更广泛的优化。
也许这个工具对你有用:Dalvik Optimization and Verification With dexopt
顺便说一句,你提到的例子并不总是有效的;将a / 4 转换为a >> 2 并不能保证让您的程序在任何处理器上运行得更快。我曾经在某处读过一篇文章(抱歉,现在找不到...)解释说在(我认为)现代 x86 处理器上,a >> 2 甚至可能比a / 4 慢。
在任何情况下,都不要进行过早的优化,例如在源代码中手动将 a / 4 转换为 a >> 2,除非您有真正的证据(来自性能测量)表明这样做是值得的。
【讨论】:
如果您的执行平台确实在执行字节码,那么您对 a / 4 比 a >> 2 更快的直觉可能是错误的。您需要进行一些认真的应用程序分析才能弄清楚:
FWIW,javac 编译器不太可能尝试微优化算术。最佳的原生代码取决于实际执行平台的硬件,如果 javac 试图优化字节码,可能会使 JIT 编译器的任务更加困难。
【讨论】: