2015-12-30 83 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