我做了一些使用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