我正在使用a toy interpreter in Java,我正在考虑尝试编写一个可以为Java虚拟机生成字节码的简单编译器。这让我想到,目标虚拟机(如JVM和CLI)的编译器需要做多少优化?
Just In Time(JIT)编译器是否进行常数折叠,窥视孔优化等?
答案 0 :(得分:4)
我要在运行时添加两个很好地解释Java's bytecode的链接和一些JVM的various optimization。
答案 1 :(得分:3)
在大多数情况下,优化字节码可能是矛盾的
我认为这不是真的。像提升循环不变量和传播常量这样的优化永远不会受到伤害,即使JVM足够智能,可以通过简单的方式减少代码执行工作。
答案 2 :(得分:3)
优化是使JVM成为长期运行应用程序环境的可行之处,您可以打赌SUN,IBM和朋友们正在尽最大努力确保他们能够以尽可能高效的方式优化您的字节码和JIT编译代码。 / p>
话虽如此,如果你认为你可以预先优化你的字节码,那么它可能不会造成太大的伤害。
然而,值得注意的是,当只提供Java编译器倾向于构造的字节码时,JVM可能倾向于表现更好(而不是崩溃)。当字节码的排列发生正确但不同于javac产生的情况时,错过优化甚至JVM崩溃并不是未知的。希望现在这种事情更多,但可能需要注意。
答案 3 :(得分:2)
ProGuard等混淆器将为您的字节码执行许多静态优化。
答案 4 :(得分:1)
HotSpot编译器将在运行时优化您的代码,比编译时更好 - 毕竟它有更多的信息可以使用。你应该优化字节码而不仅仅是你的算法的唯一一次是当你瞄准移动设备时,比如Blackberry,那个平台的JVM功能不足以在运行时优化代码而只执行字节码。
答案 5 :(得分:0)
在大多数情况下,优化字节码可能是矛盾的。除非您控制VM,否则您不知道它如何加速代码执行(如果有的话)。编译器需要知道VM的细节才能生成优化的代码。
答案 6 :(得分:0)
Aseraphim的注释:
在某些有限的情况下,优化非嵌入式应用程序的字节码也很有用:
通过网络传递代码时,例如WebStart应用程序,以最大限度地减少可交付物/缓存大小,并且因为您不一定知道客户端的能力/速度。
对于您知道性能至关重要且在启动时使用的代码(比如说)HotSpot有时间收集任何统计信息。
同样,优秀的优化器/混淆器执行的转换可能非常有用。