7

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

4

2 回答 2

3

我知道至少有一种基于 JVM 的语言,它的共享仍然是无名的,速度慢得要命。它可能使用了一些编译时优化。

Javac 和 JVM 分析的编程模型大致相同,因此 Javac 可以采用的任何优化技术也可以被 JVM 采用。那么,Javac 重复这项工作就没有多大意义了。实际上,Javac 可能更倾向于保留尽可能多的源代码结构,以便 JVM 可以更好地推理代码。

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

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

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

于 2013-03-09T16:23:40.033 回答
0

不,没有必要。

如果您查看 Javac 的输出,它实际上根本没有进行编译时优化。并且由于 Hotspot 的 JIT,很难说改变字节码会对优化产生什么影响。除非您能证明确实存在瓶颈并有时间进行调查,否则最好不要担心此类事情。

于 2013-03-09T15:55:08.587 回答