使用最新java版本重新编译旧java项目的性能优势
如果一个项目将在Java11上运行,而源代码保持不变(Java8),那么从性能角度来看,用新的(Java11)目标版本重新编译该项目有意义吗使用最新java版本重新编译旧java项目的性能优势,java,performance,jvm,jvm-bytecode,Java,Performance,Jvm,Jvm Bytecode,如果一个项目将在Java11上运行,而源代码保持不变(Java8),那么从性能角度来看,用新的(Java11)目标版本重新编译该项目有意义吗 org.apache.maven.plugins 所以,我想知道不同的编译器(基准测试)之间是否有很大的差异,最好有一个完整的列表,列出在编译阶段发生的所有优化不,javac编译器没有做太多的优化,因为JIT负责运行时的大多数优化,所以您得到的字节码相当相同。除了类文件将被标记为Java11之外,您将无法在较低版本上运行它 Java是向后兼容的,所以在
org.apache.maven.plugins
所以,我想知道不同的编译器(基准测试)之间是否有很大的差异,最好有一个完整的列表,列出在编译阶段发生的所有优化不,javac
编译器没有做太多的优化,因为JIT负责运行时的大多数优化,所以您得到的字节码相当相同。除了类文件将被标记为Java11之外,您将无法在较低版本上运行它
Java是向后兼容的,所以在新版本上运行Java8字节码并没有什么特别之处
当然,在较新的JVM上运行Java8字节码允许(可能)在JIT中使用改进的动态优化,因此只需使用较新的JVM而无需任何额外编译,就更有可能获得更好的性能
正如Johannes所说,人们总是对优化字符串的内存和速度感兴趣,因为它们是Java项目中最常用的对象。然而,它仍然是一个微基准,大多数差异来自于使用Java11编译和运行的代码与使用Java8编译和运行的代码
我试图找到可以解决重新编译问题的源代码,但没有找到任何快速浏览的内容。因此,除非有证据表明非微基准会从对Java 11字节码的重新编译中受益(现实的,而非理论的),否则我将把它归为“性能巫毒”一类。Java 9改变了字符串串联的编译方式。除此之外,这不重要。不,你不会得到相同的字节码。正如我在评论中所说,Java9改变了字符串连接的编译方式(它现在使用invokedynamic)。@JohannesKuhn我说“非常相同”。它当然不会给您带来显著的性能改进。有关它的讨论,请参阅。@JohannesKuhn有什么特别的观点吗?我不想看45分钟的String
视频,尤其是当我不知道为什么会有链接的时候。你是说这段视频鼓励人们重新编译Java9吗?我不确定我是否完全理解你的观点,但可以肯定。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>11</source>
<target>11</target>
</configuration>
</plugin>