2015-12-30 88 views
13

我有一個1.5兼容的Java源代碼,它將完全在1.8 VM上運行,並且想知道在編譯期間是否有利於1.8版本而不是舊版本。針對不同Java版本的源代碼之間的性能差異?

1.5和1.8之間會有任何性能差異嗎? 是否有任何相關的文檔或更改日誌可用,我可以看看?

+0

您是問在Java 8 JVM上Java 8類文件是否比Java 5類文件更快,或者Java 8 JVM上的Java 8類文件是否比Java 5 JVM上的Java 5類文件更快? – meriton

+0

@meriton第一個 – orom

回答

3

javac幾乎沒有優化。它所做的主要優化是不斷內聯,並一直這樣做。

區別完全在於JVM。在Java 8中,您可以有更多的選項來編寫相同的代碼,這意味着您可以重新編寫代碼以提高效率。

0

除了性能,你應該考慮其中已得到修復,因爲1.5

也有1.8的新API,如JavaFX的,NIO,lambas千元bug修復。

Oracle宣佈swing不會再更新,所以如果你的應用程序有GUI,你應該考慮開始尋找移植到javafx。

在甲骨文網站順便說一句,當你下載一個新的JDK也有一個鏈接的更新日誌

+0

有關錯誤修復的好處,但我更關心爲不同目標生成的字節碼之間的性能差異。 該應用程序沒有GUI。 – orom

+0

Thre是從Java 1.6開始的更高效的新垃圾收集器。熱點也被重寫爲x64。其他信息是我猜想更多的甲骨文的內部祕密,你只能通過自己做一些測試來比較 –

7

既然你指的是Java字節代碼,運行舊的應用程序有一個新的JVM版本編譯的Java代碼(1.8)應該可以提高應用程序的性能,而不需要重新編譯字節碼。

您可以查看關於JDK 8 performance improvement的Oracle官方文檔,以瞭解發生了什麼變化。

+2

但是,爲更新的目標產生的字節碼是「更好」嗎?我反編譯了幾個類,當定位1.5和1.8時,字節碼之間肯定有區別。 我已經看過JDK chnagelogs,但是跳到那裏會有一個特定於javac中性能相關更改的彙總版本(如果存在)。 – orom

+1

它應該沒有什麼區別,可能會有潛在的差異,但不是那麼多,甚至可能不明顯。不同的是,如果你將改變代碼以利用新的優化數據結構等等...... – aleroot

+0

它可能在未來以一些小的方式,但不是很多。例如,Java 9預計會改變字符串串聯的編譯方式,以使用invokedynamic,該功能僅在定位Java 7及更高版本時可用。 –

1

我通常將編譯設置爲1.7。 Java 8的其他特性中的新lambda語法非常好,但是我遇到了java 7的兼容性問題,而這正是我習慣的。

如果您使用虛擬機自己工作,並且您知道您不需要依賴於最終會出現問題的框架,那麼請儘量使用java 8. 您也可以查看官方文檔,但維基百科實際上提供了一個很好的更改日誌imo: https://en.wikipedia.org/wiki/Java_version_history

1

我發現this Oracle source討論了Java 7與早期版本的兼容性。它僅提到invokedynamic字節碼作爲版本7和6之間的(字節碼)差異。由於字節碼並沒有真正改變太多,所以版本5字節碼與版本8字節碼對性能的影響可以忽略不計。

+1

自從引入JVM以來,'invokedynamic'是(IIRC)唯一*真正*(或至少:唯一重要的)字節碼的變化,因此絕對值得一提。但我不確定對性能的影響是什麼。你提到它們「微不足道」,但是......性能差異*在哪裏*,它們會有多大? – Marco13

+1

根據[this](http://www.javaworld.com/article/2860079/scripting-jvm-languages/invokedynamic-101.html),「invokedynamic」的原因實際上是性能。只是不是Java性能,而是在JVM上運行的其他動態語言。 – Kayaman