【问题标题】:Does dynamically generated java byte-code need any optimization?动态生成的 java 字节码是否需要任何优化?
【发布时间】:2013-03-09 15:23:58
【问题描述】:

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

【问题讨论】:

  • 您可以尝试对示例进行硬编码并与您的字节码生成器竞争...
  • 如果你的一段代码不是经常运行,它不会被 JIT 优化,但没关系,因为它不经常运行。如果它确实经常运行,它将被优化。大家都很开心。
  • 请看这个stackoverflow.com/a/1680212/655756。换句话说,您可以进行进一步的优化,但这不是必需的,因为这些优化通常看起来更像是“化妆品”。
  • @assylias 是的,你说得对,但我真正关心的是,编译时 + jit 优化的字节码是否能胜过仅通过 jit 优化的字节码?
  • @n1ckolas 啊..,我明白了,您的意思是是否进行优化不会有太大区别。因为 jit 编译最终可以使所有字节码变得非常高效,无论原始字节码有多冗长。谢谢,proguard 可能是一个不错的工具。

标签: java jvm bytecode


【解决方案1】:

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

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

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

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

回到你的例子,你(作为编译器)有可能更了解你的更高级别的源语言,你可以执行 JVM 不可能执行的转换。

【讨论】:

  • 很好的解释!我想我明白你的意思了,这让我很清醒。所以,如果我的 DSL 引入了更高的编程模型——例如某种形式的“规则引擎”中的布尔逻辑,我可以在布尔逻辑理论中做一些优化,比如“门逻辑优化”。但如果我的 DSL 只是另一种封装的命令式编程语言,就像 java 一样,就不需要做任何优化吧?
【解决方案2】:

不,没有必要。

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

【讨论】:

    猜你喜欢
    • 2016-01-05
    • 2022-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多