我正在將一些C++代碼轉換爲Java,我想知道我可以對內聯函數做些什麼。我是否可以假設虛擬機內置函數(必要時),而不用擔心這一點?如何進行配置以觀察此行爲?假設有一個主要的外部函數,並且我爲它引發了一個for循環並引發了一百萬次調用。我應該期望看到虛擬機內存越來越多地得到改進嗎?根據需要,熱點VM內聯功能是否會啓用?
1
A
回答
4
是的,Java會內聯方法調用。內聯由JIT編譯器執行,因此您不會通過檢查字節碼文件來查看它。
對於給定的方法調用是否實際發生內聯取決於方法體的大小以及調用是否可以內聯。 (如果一個方法調用涉及調度...在JVM有一堆旨在消除不必要的調度的全局優化之後......則不能內聯)。
這同樣適用於您的外部主函數的示例。這取決於方法體的大小。另一方面,如果該方法需要大量時間來執行,則優化的相對重要性相應地降低。
我的建議是在這個階段不要擔心這樣的事情。只需清楚簡單地編寫代碼,並讓JIT編譯器處理優化問題。當您的應用程序正在運行時,您可以對其進行配置並查看代碼中是否有任何值得手動優化的「熱點」。
但我應該能夠看到這個東西像Visual VM吧?我的意思是最初沒有內聯,然後越來越多的東西被內聯,所以外部方法的平均時間略有減少。
它可能是可觀察的,也可能不是,這取決於調用相對於執行方法體所花費的時間。 (剖析通常依賴於對程序計數器進行採樣,如果給定代碼區域的樣本數量太小以及出於其他原因,報告的時間可能不準確。)
它也取決於您的JVM正在使用。並非所有的JVM都會重新優化他們之前優化過的代碼。
最後,有一種方法可以讓JVM轉儲由JIT編譯器輸出的本地代碼。如果您準備閱讀機器說明,這將給您一個確定內容的明確答案。
相關問題
- 1. 微型過濾器功能是否需要啓用APC?
- 2. PHP需要功能使用根
- 3. 複製的會話是否需要啓用粘性會話?
- 4. 是否需要釋放內存才能重新啓動redis?
- 5. 點擊功能需要2次點擊
- 6. 我是否需要啓用SQL 2005上的Service Broker端點才能使用SQLCacheDependency?
- 7. doClick()是否需要啓用組件?
- 8. 是否需要爲Firebase部署雲端功能所需的節點
- 9. 我是否需要在火力點功能上使用recaptcha的付費計劃?
- 10. jQuery點擊功能vs內聯onclick
- 11. 是否啓用安全保護功能
- 12. 還有什麼功能需要啓用才能使用「form_factor」
- 13. .htaccess將不會根據需要重寫
- 14. Google LocationServices是否需要互聯網?
- 15. iPhone需要的設備功能 - 內存
- 16. 需要Flex AdvancedDatagrid內嵌評論功能
- 17. VB.net需要內存高效功能
- 18. 功能內點擊事件需要點擊2次才能觸發
- 19. 節點:需要模塊內部功能嗎?
- 20. Flow內容是否需要Palpable內容?
- 21. 需要ASORT功能
- 22. getElementByTagName功能需要
- 23. 確定點A是否需要切角才能到達點B
- 24. 需要啓用Javascript才能使用Mechanize + BeautifulSoup(Python)的站點需要啓用Javascript的站點
- 25. 這是功能保證內聯擴展
- 26. Javascript:當在功能中添加if時,是否需要添加任何內容?
- 27. Erlang在節點/ VM重啓之間是否唯一?
- 28. 內聯ckeditor需要htmlspecialchars嗎?
- 29. 傳遞數據需要功能
- 30. .live()是否需要選擇器才能啓動?
但我應該能夠看到這個像Visual VM的東西吧?我的意思是最初沒有內聯,然後越來越多的東西被內聯,所以外部方法的平均時間略有減少。 – Nikhil 2012-04-22 05:47:50