2013-03-09 60 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,我們很難說出改變字節碼對優化有什麼影響。除非您能證明存在真正的瓶頸並有時間進行調查,否則最好不要擔心這種情況。