动态生成的java字节码是否需要进行任何优化?

时间:2013-03-09 15:23:59

标签: java jvm bytecode

我使用ASM做了一些java字节码生成 通过在访客模式中走过某种类型的小型DSL的某种AST 而且我担心生成的字节代码太“直截了当”,也就是说,没有任何“编译时优化”。
虽然在我的情况下,如果生成的字节代码没有优化就可以了,但我仍然不禁要问:是否需要那些在运行时生成字节代码的项目来进行字节码优化? 我知道,对于jvm,大多数“优化”工作是在程序运行时通过jit编译完成的。因此编译时的字节码优化可能影响很小 但是,真的吗?对动态生成的字节码进行字节码优化绝对没有意义吗?是否有任何人可以分享有关差异的经验,主要是在运行时性能方面,在有和没有任何形式的优化的字节码之间?

2 个答案:

答案 0 :(得分:2)

我知道至少有一种基于JVM的语言,这种语言仍然无名,但是很慢。它本可以使用一些编译时优化。

Javac和JVM正在分析大致相同的编程模型,因此JVM也可以采用Javac可以采用的任何优化技术。然后Javac没有太多意义重复这项工作。实际上,Javac可能最好留下尽可能多的源代码结构,以便JVM可以更好地推理代码。

如果源语言不是Java-ish语言,则不适用。

想想这一点,CPU也做了很多精彩的优化,那么为什么JVM需要做任何优化呢?为什么不把它全部留给CPU。因为CPU和JVM正在分析非常不同的代码。 CPU正在分析任意一系列机器指令(尽管它可以基于高级语言的常见行为进行假设)。 JVM正在分析一种非常具体的,更高级别的语言,JVM可以根据知识来推理和转换代码,这些知识几乎不可能让CPU从机器指令中发现。

回到你的情况,有可能你(作为编译器)对你的更高级源语言有了更多的了解,你可以执行JVM不可能进行的转换。

答案 1 :(得分:0)

不,没有必要。

如果你看一下Javac的输出,它几乎没有编译时优化。感谢Hotspot的JIT,很难说出改变字节码会对优化产生什么影响。除非你能证明存在真正的瓶颈并且有时间对其进行调查,否则最好不要担心这些事情。