我做了一些使用ASM的java字节码生成。
通过访客模式中某种小DSL的某种AST行走。
我担心生成的字节码太“直截了当”,也就是说,没有任何“编译时优化”。
虽然在我的情况下,如果生成的字节码没有被优化,那也可以,但我不禁要问:是否需要那些在运行时生成字节码来完成字节码优化的项目?
我知道对于jvm来说,大多数'优化'工作是在程序运行时通过jit编译完成的。所以编译时的字节码优化可能影响不大。
但是,真的吗?对飞行中生成的字节码进行字节码优化绝对没有意义吗?有没有人分享一些有关差异的经验,主要是在运行时性能方面,有没有任何形式的优化的字节码之间的差异?动态生成的java字节码是否需要优化?
回答
我知道至少有一种基于JVM的语言,这个共享仍然是无名的,但速度很慢。它可以使用一些编译时优化。
Javac和JVM正在分析大致相同的编程模型,因此JVM也可以使用Javac可以采用的任何优化技术。那么Javac复制工作没有太多意义。实际上,Javac最好留出尽可能多的源代码结构,以便JVM能够更好地推理代码。
如果源语言不是Java-ish语言,则不适用。
想想这个,CPU也做了很多精彩的优化,那么为什么JVM需要做任何优化?为什么不把它全部留给CPU。因为CPU和JVM正在分析非常不同的代码。 CPU正在分析机器指令的任意序列(尽管它可以根据高级语言的常见行为进行假设)。 JVM正在分析一种非常具体的,更高层次的语言,JVM可以根据CPU从机器指令发现几乎不可能发现的知识推理和转换代码。
回到您的案例,您(作为编译器)可能更了解您的更高级别的源语言,您可以执行JVM无法实现的转换。
很好的解释!我想我理解你的观点,这让我感到清醒。因此,如果我的DSL引入更高级的编程模型 - 例如某种形式的“规则引擎”的布尔逻辑,我可以在布尔逻辑理论中进行一些优化,比如“门逻辑优化”。但是如果我的DSL只是另一种封装的命令式编程语言,就像Java一样,不需要做任何优化,对吧? – 2013-03-11 03:59:37
不,这是没有必要的。
如果您看看Javac的输出,它几乎没有编译时优化。多亏了Hotspot的JIT,我们很难说出改变字节码对优化有什么影响。除非您能证明存在真正的瓶颈并有时间进行调查,否则最好不要担心这种情况。
- 1. Java字节码生成
- 2. 需要帮助进行优化 - 在java中生成幻方块
- 3. Java优化:仅字节码vs JIT
- 4. mysql_close()是否需要进行REAL优化?
- 5. for-loop优化 - 是否需要?
- 6. 是否需要优化wordpress网站
- 7. 需要动态生成“便签”文本
- 8. Java swing树:需要动态变化吗?
- 9. 为什么javah需要字节码来生成JNI头文件?
- 10. 是否需要Java序列化
- 11. 将Java源代码翻译为字节码时的优化
- 12. 需要优化此代码的建议
- 13. 需要优化JavaScript代码的网站
- 14. 我需要优化我的代码
- 15. 使用它生成Java类后,是否再需要WSDL?
- 16. 测试是否需要JAXB生成的字段
- 17. Java:需要帮助优化代码的一部分
- 18. 是否需要hadoop的java?
- 19. 是否可以将LLVM字节码转换为Java字节码?
- 20. 如何优化此代码? (需要JodaTime)
- 21. 集合操作,需要帮助从报表生成器优化此代码
- 22. 有关状态机优化和代码生成的参考?
- 23. 是否在后面的代码中动态生成asp控件?
- 24. 我的基本PHP Socket服务器是否需要优化?
- 25. 新到Java - 代码列出重复需要优化
- 26. 如何优化代码去除不需要的字符
- 27. 大字节优化[]
- 28. 可能优化字节码序列
- 29. 如何使用字节码来优化动态语言的执行时间?
- 30. Hibernate是否需要Java EE
你可以试着对一个例子进行硬编码并将其与你的字节码生成器竞争... – 2013-03-09 15:29:38
如果你的代码片段不是经常运行,它不会被JIT优化,但它并不重要,因为它不经常运行。如果它经常运行,它将被优化。每个人都很开心。 – assylias 2013-03-09 15:34:22
请看这个http://stackoverflow.com/a/1680212/655756。换句话说,您可能会进行进一步的优化,但并不是必需的,因为通常这些优化看起来更像是“整型”优化。 – n1ckolas 2013-03-09 15:41:10