Флаги оптимизации 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) для оптимизации.