我们目前有用Java 8编译的代码,但是我们正在Java11VM上运行它。现在,我们也在尝试将代码移到Java 11编译时。想知道Java 8编译代码与Java 11编译代码是否有什么好处,因为这两种编译器都会产生不同的类文件(字节码)?在效率方面,两者有何不同?
发布于 2020-10-07 00:56:40
javac是不是优化编译器,所以一般来说,不要期望它从一个版本到另一个版本生成“更快”的字节码。优化是JVM的一项工作。
同时,Java确实支持新的语言特性,并且可能支持新的JVM特性。其中一些确实对性能有影响。JDK9-JDK11中最值得注意的例子如下。
+表达式被转换为
新StringBuilder().append()...append().toString();
虽然JIT承认这些链并试图在运行时优化它们,但是这种优化是脆弱的,并不总是像预期的那样工作。将字符串与invokedynamic连接在一起可以使JVM有更多的自由来生成更好的代码。您可以在这个JEP的备注中找到详细的解释和基准测试。更新
以前,我在这个列表中包括了JDK-8175883:用于增强循环的字节码生成,但是正如@Holger在评论中注意到的那样,这种“优化”实际上并不有效。
结论
Java编译器的变化主要与新的语言/JVM特性有关。字节码级优化不是目标。然而,其中一些变化也可能(间接)影响性能。无论如何,重新编译代码可能带来的性能好处非常小,以至于在实际应用程序中您甚至都不会注意到它们。
https://stackoverflow.com/questions/64232267
复制相似问题