Java 优化:字节码优化 vs JIT

6
开发安卓设备游戏时,我需要针对完全没有JIT并且仅依赖字节码优化的设备进行开发。我想知道这些优化的集合是否为空。
实际上,Java编译器(即javac而不是JIT)是否会进行任何优化,例如将a / 4转换为>>2?或者所有的优化都是JIT的工作?

除法和左移对整个程序速度没有任何影响。一点也没有。 - user395760
2个回答

7
标准Java编译器会进行一些优化,但大多数优化都留给JIT来完成。JIT知道程序运行的确切处理器,并且可以访问运行时信息,因此它可以比Java编译器提前做更多的优化。此外,提前进行广泛的优化可能会使字节码有些“混淆”,从而使JIT难以对其进行优化。
我不知道谷歌的编译器在将Java字节码转换为Dalvik代码时会做什么-它可能会进行更广泛的优化。
也许这个工具对您有用:使用dexopt进行Dalvik优化和验证 顺便说一句,您提到的例子并不总是有效的;将a / 4转换为a >> 2不能保证在任何处理器上都能使程序运行更快。我曾经在某个地方读过一篇文章(抱歉,现在找不到了……)解释说,在(我认为是)现代x86处理器上,a >> 2甚至可能比a / 4更慢。
无论如何,在源代码中不要手动进行过早的优化,例如将a / 4转换为a >> 2,除非您有真实的证据(来自性能测量)表明这样做是值得的。

谢谢你们两个。我并没有进行微观优化,我喜欢易读性,但是我只是想知道没有JIT的设备是否会受到所有可能的罪恶影响,或者编译器是否会进行微不足道的优化。正如你所提到的,我的例子并不是那么简单...是一个糟糕的例子。 - Aurelien Ribon

2
如果你的执行平台真的在执行字节码,那么你对像 a / 4a >> 2 更快的直觉可能是错误的。你需要进行一些严肃的应用程序分析来弄清楚:
  • 是否值得优化,
  • 在哪里集中精力,以及
  • 什么(微)优化实际上起作用。
顺便说一下,javac 编译器不太可能尝试微调算术运算。最佳本地代码取决于实际执行平台的硬件,如果 javac 尝试优化字节码,则很可能会使 JIT 编译器的任务更加困难。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接