2012-04-22 66 views
1

我正在將一些C++代碼轉換爲Java,我想知道我可以對內聯函數做些什麼。我是否可以假設虛擬機內置函數(必要時),而不用擔心這一點?如何進行配置以觀察此行爲?假設有一個主要的外部函數,並且我爲它引發了一個for循環並引發了一百萬次調用。我應該期望看到虛擬機內存越來越多地得到改進嗎?根據需要,熱點VM內聯功能是否會啓用?

回答

4

是的,Java會內聯方法調用。內聯由JIT編譯器執行,因此您不會通過檢查字節碼文件來查看它。

對於給定的方法調用是否實際發生內聯取決於方法體的大小以及調用是否可以內聯。 (如果一個方法調用涉及調度...在JVM有一堆旨在消除不必要的調度的全局優化之後......則不能內聯)。

這同樣適用於您的外部主函數的示例。這取決於方法體的大小。另一方面,如果該方法需要大量時間來執行,則優化的相對重要性相應地降低。


我的建議是在這個階段不要擔心這樣的事情。只需清楚簡單地編寫代碼,並讓JIT編譯器處理優化問題。當您的應用程序正在運行時,您可以對其進行配置並查看代碼中是否有任何值得手動優化的「熱點」。


但我應該能夠看到這個東西像Visual VM吧?我的意思是最初沒有內聯,然後越來越多的東西被內聯,所以外部方法的平均時間略有減少。

它可能是可觀察的,也可能不是,這取決於調用相對於執行方法體所花費的時間。 (剖析通常依賴於對程序計數器進行採樣,如果給定代碼區域的樣本數量太小以及出於其他原因,報告的時間可能不準確。)

它也取決於您的JVM正在使用。並非所有的JVM都會重新優化他們之前優化過的代碼。

最後,有一種方法可以讓JVM轉儲由JIT編譯器輸出的本地代碼。如果您準備閱讀機器說明,這將給您一個確定內容的明確答案。

+0

但我應該能夠看到這個像Visual VM的東西吧?我的意思是最初沒有內聯,然後越來越多的東西被內聯,所以外部方法的平均時間略有減少。 – Nikhil 2012-04-22 05:47:50

相關問題