我用ASM做了一些java字节码的生成。
通过在访问者模式中遍历某种小型DSL的某种AST。
我担心生成的字节码太“简单”,也就是说,没有任何“编译时优化”。
虽然在我的例子中,如果生成的字节码没有优化,这可能是可以的,但我仍然不禁要问:那些在运行时生成字节码的项目是否需要进行字节码优化?
我知道这样一个事实,对于jvm,大多数“优化”工作是在程序运行时通过jit编译完成的。因此,编译时的字节码优化可能影响很小。
但是,真的吗?对动态生成的字节码进行字节码优化是完全没有意义的吗?有没有人分享一些关于字节码之间的差异的经验,主要是在运行时性能方面,有没有做过任何形式的优化?
发布于 2013-03-10 00:23:40
我知道至少有一种基于JVM的语言,它们共享的名称仍然没有命名,它的速度慢得像地狱。它可以使用一些编译时优化。
Javac和JVM分析的是大致相同的编程模型,因此Javac可以采用的任何优化技术也可以被JVM采用。那么Javac复制这项工作就没有多大意义了。实际上,最好的做法是Javac尽可能多地保留源代码的结构,这样JVM就可以更好地理解代码。
如果源语言不是Java语言,则不适用。
想想看,CPU也做了很多奇妙的优化,那么为什么JVM需要做任何优化呢?为什么不把这些都留给CPU呢?因为CPU和JVM分析的是非常不同的代码。CPU正在分析任意的机器指令序列(尽管它可以基于高级语言的常见行为进行假设)。JVM正在分析一种非常具体的、更高级的语言,JVM可以根据CPU几乎不可能从机器指令中发现的知识来推理和转换代码。
回到您的情况,您(作为编译器)可能更了解您的更高级别的源语言,您可以执行JVM不可能执行的转换。
发布于 2013-03-09 23:55:09
不不用了。
如果您查看Javac的输出,您会发现它实际上根本没有进行编译时优化。多亏了Hotspot的JIT,很难断定更改字节码将对优化产生什么影响。最好不要担心这样的事情,除非你能证明存在真正的瓶颈,并有时间调查它。
https://stackoverflow.com/questions/15312358
复制相似问题