Улучшения производительности Java 6 в JDK, JVM или в обоих?

Мне было интересно узнать об улучшении производительности, рекламируемом в Java SE 6 - в компиляторе или во время выполнения? Другими словами, будет ли приложение Java 5, скомпилированное с помощью JDK 6, улучшаться под JSE 5 (что указывает на улучшенную оптимизацию компилятора)? Будет ли приложение Java 5, скомпилированное с помощью JDK 5, улучшаться под JSE 6 (что указывает на улучшенную оптимизацию времени выполнения)?

Я заметил, что компиляция под JDK 6 занимает почти вдвое больше времени, чем под JDK 5, для той же самой кодовой базы; Я надеюсь, что по крайней мере часть этого дополнительного времени будет потрачена на оптимизацию компилятора, что, надеюсь, приведет к более производительным JAR и WAR. Информация Sun JDK на самом деле не содержит подробностей об улучшении производительности, которое они сделали - я предполагаю, что это немного из столбца A и немного из столбца B, но мне интересно, что больше влияет. Кто-нибудь знает какие-либо тесты, сделанные на JDK 6 против JDK 5?


person Adrian    schedule 18.09.2008    source источник


Ответы (4)


Я не слышал об улучшениях в компиляторе, но была опубликована обширная информация об улучшениях производительности во время выполнения.

Руководство по миграции:

http://java.sun.com/javase/6/webnotes/adoption/adoptionguide.html

Технический документ по эффективности:

https://www.oracle.com/java/technologies/javase/6performance.html

person tovare    schedule 18.09.2008

javac, который компилируется из исходного кода Java в байт-коды, почти не оптимизирует. Действительно, оптимизация часто заставляла код работать медленнее из-за того, что его труднее анализировать для дальнейшей оптимизации.

Единственное существенное различие между сгенерированным кодом для 1.5 и 1.6 состоит в том, что с -target 1.6 добавляется дополнительная информация о состоянии стека, чтобы сделать проверку проще и быстрее (Java ME тоже делает это). Это влияет только на скорость загрузки классов.

Реальная часть оптимизации - это компилятор точки доступа, который компилирует байт-код в машинный код. Это даже обновляется в некоторых выпусках обновлений. В Windows по умолчанию в JRE распространяется только более медленная клиентская версия точки доступа C1. Точка доступа сервера C2 работает быстрее (используйте -server в командной строке java), но медленнее запускается и использует больше памяти.

Также библиотеки и инструменты (включая javac) иногда оптимизируют работу.

Я не знаю, почему вы обнаруживаете, что JDK 6 медленнее компилирует код, чем JDK 5. Есть ли какая-то тонкая разница в настройке?

person Tom Hawtin - tackline    schedule 18.09.2008

Это почти 100% время выполнения. Хотя некоторые базовые приемы компиляции можно включить в сам компилятор Java, я не верю, что есть какие-либо существенные улучшения между Java 1.5 и 1.6.

person jsight    schedule 18.09.2008

В новую виртуальную машину Java внесено много новых улучшений и оптимизаций. Таким образом, в основном вы увидите повышение производительности при запуске java с версией 6 jvm.

Компиляция старого кода Java с использованием Java 6 JDK, вероятно, даст более эффективный код, но основные улучшения связаны с виртуальной машиной, по крайней мере, это то, что я заметил.

person Hans Sjunnesson    schedule 18.09.2008