Флаги оптимизации javac
Недавно я писал много кода на C и теперь перешел на Java. В настоящее время я реализую большую структуру данных и задаюсь вопросом, есть ли какие-либо флаги оптимизации, которые я могу включить, когда я вызываю компилятор Java, чтобы повысить производительность, например, в gcc.
Я привык:
gcc -O3 -NDEBUG MyProgram.c
есть ли аналогичная команда для javac
?
Я использую JDK и запускаю Ubuntu 10.04.
Ответы
Ответ 1
Оптимизация в Java в основном выполняется компилятором JIT во время выполнения. Следовательно, нет смысла пытаться научить его оптимизировать определенный способ во время компиляции (когда он все равно создает только байт-код). JIT почти наверняка примет правильные решения на месте, зная точную среду и наблюдая фактические шаблоны выполнения определенных частей вашего кода.
Существуют некоторые специфические параметры компилятора, влияющие на производительность, но они предназначены для настройки JVM (включая сборщик мусора), а не для оптимизации самого кода.
Ответ 2
Нет эквивалента -O3
или любого из уровней -O
, но есть определенные параметры настройки, к которым у вас есть доступ через -XX:
. Здесь есть полный список здесь.
Это предполагает, что вы используете JVM, предоставляемый Oracle, однако это может различаться в зависимости от вашей среды ( "использование JDK" на самом деле не описывает, какую версию вы используете)
Ответ 3
Вы можете оптимизировать байт-код Java, запустив его через Proguard, популярный Java-обфускатор. Он будет сжимать, оптимизировать и обфускать код в этом порядке с помощью переключателей для управления почти всем. Он удалит неиспользуемые методы и переменные, встроенный код, удалит мертвые ветки, объединит идентичный код и выполнит десятки других оптимизаций. Результатом является файл jar, который делает то же самое, что и ваш вход, но занимает меньше места и работает быстрее.
Это необходимо для коммерческого программного обеспечения на стороне клиента.
Ответ 4
Оптимизации Java-кода применяются во время выполнения, поскольку виртуальная точка Hotspot считает нужным. (Насколько я знаю, это включает в себя отслеживание подсчетов вызовов методов и компиляцию часто называемых методов в собственный код и также попытку нескольких типов оптимизаций.)
Единственным дистанционно подключенным коммутатором, который можно использовать с javac
, является -g:none
, который сообщает компилятору опустить отладочную информацию: это не влияет на производительность вашего кода, но уменьшает размер файлов .class
.
Когда вы запускаете виртуальную машину, у вас есть выбор между параметрами -server
и -client
, которые будут влиять на диапазон оптимизаций и то, как рано они вступают.
Ответ 5
JVM и JIT будут выполнять большую часть оптимизаций для вашего кода во время выполнения, поэтому вам придется укусить пулю и доверять базовым манипуляторам байт-кода (JVM и JIT) для оптимизации.