Преимущества производительности при перекомпиляции старого Java-проекта с последней версией Java - PullRequest
4 голосов
/ 08 октября 2019

Имеет ли смысл перекомпилировать проект с новой целевой версией (java 11) с точки зрения производительности, если он будет работать на java 11, а исходный код останется прежним (java 8)?

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

Какие подводные камни для запуска байт-кода java 8 на более новой JVM?

Обновление:

Оптимизатор кода - это одна из фаз фазы компиляции, где:

  • Помогает установитьВыключение между скоростью выполнения и компиляции
  • Улучшает время выполнения целевой программы
  • Генерирует упорядоченный код, все еще находящийся в промежуточном представлении
  • Удаление недоступного кода и избавление от неиспользуемых переменных
  • Удаление операторов, которые не изменяются из цикла
  • и т. Д.

Подробнее: https://www.guru99.com/compiler-design-phases-of-compiler.html

Итак, мне интересно, если это большая разницамежду различными компиляторами (бенчмарками), было бы неплохо иметь полный список всех оптимизаций, происходящих на этапе компиляции

1 Ответ

4 голосов
/ 08 октября 2019

Нет, компилятор javac не выполняет большую оптимизацию, поскольку JIT отвечает за большинство оптимизаций во время выполнения, поэтому вы получите довольно идентичный байт-код. За исключением того, что файл класса будет помечен как Java 11, так что вы не сможете запустить его на более низкой версии.

Java обратно совместима, поэтому запуск байт-кода Java 8 на более новых версиях не является чем-то особенным.

Конечно, запуск байт-кода Java 8 на более новой JVM позволяет (возможно) использовать улучшенные динамические оптимизации в JIT, так что вы с большей вероятностью получите улучшенную производительность, просто используя более позднюю JVM без какой-либо дополнительной компиляции.

Как показывает видео Йоханнеса, всегда есть интерес оптимизировать строки для памяти и скорости, так как они являются наиболее часто используемыми объектами в проектах Java. Однако это все еще микробенчмарк, и большинство различий происходит от кода, скомпилированного и запущенного с Java 11, по сравнению с кодом, скомпилированным и запущенным с Java 8.

Я попытался найти источники, которые бы отвечали на перекомпиляцию , но ничего не мог найти с быстрым взглядом. Поэтому до тех пор, пока не будет доказательств того, что немикробенчмарки выиграют (реалистично, а не теоретически) от перекомпиляции до байт-кода Java 11, я буду классифицировать его как "Performance Voodoo".

...