Подтвердить что ты не робот

Должен ли я использовать опцию javac -O для оптимизации?

javac имеет интересную опцию -O:

Оптимизирует скомпилированный код путем вложения статических, конечных и частных методов. Обратите внимание, что ваши классы могут иметь больший размер.

Этот вариант кажется не популярным (скрытым?), я только что открыл его сегодня, на CodeCup 2014 page.

-O не упоминается в официальной документации и в man javac... Странно.

В принятом ответе на аналогичный question мы можем прочитать, что:

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

Мой вопрос:

Должен ли я всегда использовать параметр -O или нет? Другими словами, код всегда работает быстрее с -O или вообще не имеет значения?

Возможно, размер классов может увеличиться настолько, что общая производительность снизится? Или JVM будет делать inlining так или иначе, чтобы лучше оставить это для этого?

Аналогичная история была с флагом gcc -O3.

4b9b3361

Ответ 1

Это не-op в соответствии с комментарием в исходный код вокруг строки 553.

Вероятно, это было полезно, когда компилятор JIT еще не был эффективен или вообще не было компилятора JIT.

Ответ 2

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

Ответ 3

Я не думаю, что он оптимизирует, как вы думаете:

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

Пожалуйста, ознакомьтесь с этими вопросами:

Обновление

Вы не найдете этого в любой документации Oracle, потому что он фактически ничего не делает (no-op). Кроме того, ссылка является очень старой документацией:

Поднимите две каталоги в ссылка - Это документация для jdk 1.1.3.. Это 13 - 14 лет! Теперь мы находимся на Jdk 7 и с нетерпением ждем Jdk 8.