使用最新的Java版本重新编译旧的Java项目的性能优势

问题描述 投票:3回答:1

如果从源角度保持不变(java 8)在Java 11上运行,从性能角度重新编译具有新目标版本(java 11)的项目是否有意义?

<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>

在较新的JVM上运行Java 8字节码有什么陷阱?

更新:

代码优化器是编译阶段的阶段之一,其中:

  • 它可以帮助您在执行力和编译速度
  • 改善目标程序的运行时间
  • 仍以中间表示形式生成简化的代码
  • 删除无法访问的代码并摆脱未使用的变量
  • 删除循环中未更改的语句

更多:https://www.guru99.com/compiler-design-phases-of-compiler.html

所以,我想知道不同的编译器(基准)之间是否有很大的区别,如果能在编译阶段获得所有优化的完整列表,将是一件很好的事情

java performance jvm jvm-bytecode
1个回答
4
投票

不,javac编译器没有进行太多优化,因为JIT在运行时负责大多数优化,因此您将获得完全相同的字节码。除了该类文件将被标记为Java 11之外,因此您将无法在较低版本上运行它。

Java是向后兼容的,因此在较新版本上运行Java 8字节码没什么特别的。

当然,在较新的JVM上运行Java 8字节码可以(可能)在JIT中使用改进的动态优化,因此,仅使用较新的JVM而无需进行任何其他编译,您更有可能获得改进的性能。

正如Johannes的video所示,总是有兴趣针对内存和速度来优化String,因为它们是Java项目中最常用的对象。但是,它仍然是一个微基准,大多数区别来自使用Java 11编译和运行的代码与使用Java 8编译和运行的代码。

我试图找到可以解决recompilation的资源,但很快就找不到任何东西。因此,直到有证据表明非微基准技术将从recompilation到Java 11字节码受益(现实,而不是理论上),我将其分类为“ Performance Voodoo”。

© www.soinside.com 2019 - 2024. All rights reserved.