Java优化:仅字节码与JIT

时间:2011-01-27 14:17:52

标签: java android jit bytecode

为Android设备开发游戏,我需要针对完全没有JIT的设备,并且只依赖于字节码优化。我想知道这些优化的集合是否为空......

实际上,java编译器(硬编译器,javac,而不是JIT)是否进行任何优化,例如将a / 4转换为>> 2?或者每次优化都是JIT的工作吗?

2 个答案:

答案 0 :(得分:7)

标准Java编译器执行一些优化,但它将大部分优化留给了JIT。

JIT知道程序正在运行的处理器,并且还可以访问运行时信息,因此它可以比Java编译器提前做更多的优化。此外,提前进行广泛的优化可能会使字节代码“混淆”,使JIT更难以优化它。

我不知道Google的编译器在将Java字节代码转换为Dalvik代码时会做什么 - 它可能会进行更广泛的优化。

也许此工具对您有用:Dalvik Optimization and Verification With dexopt

顺便说一下,你提到的例子并不总是有效的;将a / 4转换为a >> 2并不能保证您的程序在任何处理器上运行得更快。我曾经在某处读过一篇文章(抱歉,现在找不到......),这解释了(我认为)现代x86处理器,a >> 2甚至可能比a / 4慢。

在任何情况下,都不要进行过早的优化,例如在源代码中手动转换a / 4a >> 2,除非您有真实的证据(来自性能测量),这是值得的。< / p>

答案 1 :(得分:2)

如果你的执行平台真的在执行字节码,你对a / 4a >> 2更快的事情的直觉可能是错误的。你需要做一些严肃的应用程序分析来弄清楚:

  • 是否值得优化,
  • 在哪里集中精力,
  • 什么(微观)优化实际上有效。

FWIW,javac编译器不太可能尝试微优化算法。最佳本机代码取决于实际执行平台的硬件,如果javac尝试优化字节码,则可能使JIT编译器的任务更加困难。