2013-03-09 63 views
5

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

+0

你可以试着对一个例子进行硬编码并将其与你的字节码生成器竞争... – 2013-03-09 15:29:38

+0

如果你的代码片段不是经常运行,它不会被JIT优化,但它并不重要,因为它不经常运行。如果它经常运行,它将被优化。每个人都很开心。 – assylias 2013-03-09 15:34:22

+0

请看这个http://stackoverflow.com/a/1680212/655756。换句话说,您可能会进行进一步的优化,但并不是必需的,因为通常这些优化看起来更像是“整型”优化。 – n1ckolas 2013-03-09 15:41:10

回答

2

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

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

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

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

回到您的案例,您(作为编译器)可能更了解您的更高级别的源语言,您可以执行JVM无法实现的转换。

+0

很好的解释!我想我理解你的观点,这让我感到清醒。因此,如果我的DSL引入更高级的编程模型 - 例如某种形式的“规则引擎”的布尔逻辑,我可以在布尔逻辑理论中进行一些优化,比如“门逻辑优化”。但是如果我的DSL只是另一种封装的命令式编程语言,就像Java一样,不需要做任何优化,对吧? – 2013-03-11 03:59:37

0

不,这是没有必要的。

如果您看看Javac的输出,它几乎没有编译时优化。多亏了Hotspot的JIT,我们很难说出改变字节码对优化有什么影响。除非您能证明存在真正的瓶颈并有时间进行调查,否则最好不要担心这种情况。