【问题标题】:Java optimizations : bytecode-only vs JITJava 优化:仅字节码与 JIT
【发布时间】:2011-01-27 22:52:40
【问题描述】:

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

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

【问题讨论】:

  • 除法与左移对整体程序速度没有任何影响。一点都没有。

标签: java android jit bytecode


【解决方案1】:

标准 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,除非您有真正的证据(来自性能测量)表明这样做是值得的。

【讨论】:

  • 谢谢(你们俩)。我并没有真正进行任何微优化,我喜欢易于阅读,但只是想知道没有 JIT 的设备是否会遭受所有可能的罪过,或者编译器是否进行了微不足道的优化。正如你提到的,我的例子并不是那么微不足道......是一个糟糕的例子。
【解决方案2】:

如果您的执行平台确实在执行字节码,那么您对 ​​a / 4a >> 2 更快的直觉可能是错误的。您需要进行一些认真的应用程序分析才能弄清楚:

  • 是否值得优化,
  • 您的工作重点在哪里,以及
  • 哪些(微)优化实际上有效。

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

【讨论】:

    猜你喜欢
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多