Преимущества производительности перекомпиляции старого проекта Java с последней версией Java

Имеет ли смысл перекомпилировать проект с новой (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

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


person Serge    schedule 08.10.2019    source источник
comment
Java 9 изменил способ компиляции конкатенации строк. Кроме этого, это не должно иметь значения.   -  person Johannes Kuhn    schedule 08.10.2019


Ответы (1)


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

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

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

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

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

person Kayaman    schedule 08.10.2019
comment
Нет, вы не получите идентичный байт-код. Как я сказал в комментариях, в Java 9 изменился способ компиляции конкатенации строк (теперь он использует invokedynamic). - person Johannes Kuhn; 08.10.2019
comment
@JohannesKuhn Я сказал довольно идентично. Это, конечно, не дает вам значительных улучшений производительности. - person Kayaman; 08.10.2019
comment
См. это обсуждение, чтобы обсудить это. - person Johannes Kuhn; 08.10.2019
comment
@JohannesKuhn какой-то конкретный момент? Мне не хочется смотреть 45 минут String видео, особенно когда я не знаю, зачем мне дана ссылка. Вы говорите, что видео побуждает людей перекомпилировать для Java 9? - person Kayaman; 08.10.2019
comment
Ну, я не уверен, что полностью понимаю, о чем вы говорите, но уверен. - person Kayaman; 08.10.2019
comment
Первая строка представляет собой обычное объединение строк foo + "bar + baz". Последняя колонка — ну Java 11. Как видите, в этом случае производительность лучше. Я настоятельно рекомендую посмотреть весь доклад. - person Johannes Kuhn; 08.10.2019
comment
@JohannesKuhn Я прекрасно понимаю видео. Я знаю, что есть много улучшений, особенно в отношении строк, но нет смысла перекомпилировать вашу программу. Большая часть обработки строк выполняется в библиотеках, а не в вашем коде, поэтому, чтобы получить какое-либо преимущество от перекомпиляции, вам потребуется программа, которая в основном обрабатывает строки и не использует библиотеки. В противном случае вы получите множество улучшений, просто запустив Java 11 JVM. - person Kayaman; 08.10.2019
comment
Я согласен. Но я не знаю, какое приложение у OP. Это может быть приложение на основе строк, а может и нет. Я не знаю. В будущем String.format и лямбда-выражения без захвата будут компилироваться по-разному (и большее количество лямбда-выражений будет считаться незахватывающим — см. YMMV, но может быть веская причина перекомпилировать код. - person Johannes Kuhn; 08.10.2019