從編譯java到本地代碼,還是現代熱點編譯器最終都會隨着時間的推移而這樣做呢?將java編譯爲本機代碼的性能如何?
回答
最近在這裏有一個類似的討論,對於What are advantages of bytecode over native code?這個問題。您可以在該主題中找到有趣的答案。
內存性能或CPU性能?或者這些日子他們是一樣的嗎?我的唯一證據是軼事,並在一個不同的平臺上:將一堆渴望CPU的應用程序移植到C#(.NET 2.0)之後,我沒有注意到性能上的重大損失(我不認爲10%的實質性)。編寫良好的代碼似乎在各種架構上表現良好。
大多數應用程序與花/浪費時間:
- IO操作不會從靜態(編譯時)的分析中獲益。
- 不會從靜態分析中受益的錯誤算法。
- 關鍵CPU內部循環中的內存佈局不良。雖然編譯器在技術上有可能幫助我們,但我還沒有看到真正的編譯器做任何有趣的事情。
因此,根據我的經驗,除非您正在編寫視頻編解碼器,否則編譯Java應用程序與僅依賴熱點編譯器無關。
還有一些軼事證據。我已經參與了一些性能關鍵的實時交易財務應用程序。我同意弗蘭克的觀點,幾乎每次你的問題不是缺乏被編譯的時候,它就是你的算法或數據結構。現代的熱點編譯器使用正確的代碼非常好,例如CERN Colt library在編譯和優化Fortran的90%以內,用於數字化工作。
如果您擔心速度問題,我真的會推薦一個好的分析器並獲得有關瓶頸位置的證據 - 我使用YourKit並且非常高興。
在過去的幾年中,我們只使用了本機編譯代碼來提高速度,這樣我們就可以使用CUDA並獲得一些嚴重的GPU性能。
你的問題有點大,得到的答案相差很多
- 如果您正在使用即時編譯(JIT)或不
- 當您使用,,如果你的進程的執行很長時間沒有
所有最近的JVM使用JIT,但在舊的JVM上,java代碼比本機代碼慢了幾倍。
如果您有一臺長時間運行的服務器或一次又一次執行相同代碼的批處理,則差異會很小。
我們在C++和Java中都編寫了相同的批處理,並使用不同的數據集運行它,結果相差大約3秒,數據集從5分鐘到幾個小時不等。
但是要小心,它們會有一個重要的區別,例如需要大量內存的批處理。
嘗試了六種不同的實現方式的Hello-World,只是爲了檢查開銷 而且差別是驚人的。 Java不在圖表中,而編譯的語言同樣出色。如果需要的話,我可以證明所有證據(可重現)。
- 1. Ionic將代碼編譯爲本機?
- 2. 如何編譯java代碼?
- 3. 將Facelets編譯爲Java代碼
- 4. 如何將C++/CLI代碼的某些部分編譯爲本機,並將某些部分編譯爲託管?
- 5. 是否有可能使用pypy將Java字節碼編譯爲本地代碼?
- 6. 如何將VM特定的代碼編譯爲x86機器代碼?
- 7. 編譯代碼的IronPython導入性能
- 8. 如何讓我的java代碼編譯?
- 9. 是否有可能將.NET IL代碼編譯爲機器代碼?
- 10. 編譯本機代碼使用NDK
- 11. 如何將ocaml編譯爲本地代碼
- 12. 如何編譯java源代碼?
- 13. Rust如何編譯爲機器碼?
- 14. PHP編譯器編碼的代碼安全性如何?
- 15. 如何編譯Java代碼的Clojure代碼後leiningen
- 16. 如何將字節碼轉換爲機器本機代碼
- 17. 爲什麼這個簡單的java代碼不能編譯?
- 18. 爲什麼Eclipse不能在java 1.5中編譯我的代碼?
- 19. Java代碼不會編譯
- 20. 錯誤編譯Java代碼
- 21. 通過編譯java代碼
- 22. 從反編譯java代碼
- 23. Java代碼和JIT編譯
- 24. 我的源代碼如何在java 1.7下編譯爲1.6
- 25. 代碼合同編譯器如何認爲這可能爲空?
- 26. 如何使用GCC將C代碼編譯爲8088彙編?
- 27. Xamarin AOT編譯不可能,因爲版本代碼爲高
- 28. 如何調試Java編譯器源代碼(Javac)本身?
- 29. H2 jar編譯爲本機窗口代碼
- 30. 只能編譯代碼
Hello World並不代表現實生活中的工作量,我懷疑它是由JVM優化的。對於這種非常小的情況,與編譯語言相比,Java很可能會失去它。 – nhahtdh 2013-09-06 20:05:17