2011-01-27 74 views
6

为Android设备开发游戏,我需要针对没有JIT的设备,而只依赖字节码优化。我不知道这些优化的集合是否为空...Java优化:仅字节码vs JIT

其实,java编译器(硬件,javac,不是JIT)是否会进行任何优化,如将/ 4转换为>> 2?或者每个优化都是针对JIT的一项工作?

+0

分区与左移对整体编程速度没有任何影响。没有丝毫的一点。 – delnan 2011-01-27 15:18:39

回答

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/4改为a >> 2,除非您有确实的证据(从性能测量结果)确实值得这样做。

+0

谢谢(你们俩)。我没有真正进行任何微型优化,我喜欢简单的可读性,但只是想知道没有JIT的设备会遭受每一个可能的罪,或者如果编译器做了微不足道的优化。正如你所提到的,我的例子并不是那么简单......是一个糟糕的例子。 – 2011-01-27 16:39:45

2

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

  • 是否值得优化可言,
  • 那里集中你的努力,
  • 什么(微)优化实际工作。

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