Вопрос

я возился с игрушечный интерпретатор на Java и я подумывал написать простой компилятор, который мог бы генерировать байт-код для виртуальной машины Java.Это заставило меня задуматься: какую оптимизацию необходимо выполнить компиляторам, предназначенным для виртуальных машин, таких как JVM и CLI?

Выполняют ли компиляторы Just In Time (JIT) постоянное свертывание, оптимизацию глазка и т. д.?

Это было полезно?

Решение

Я просто добавлю две ссылки, которые объясняют Байт-код Java довольно хорошо и некоторые из различные оптимизации JVM во время выполнения.

Другие советы

Оптимизация байт-кода в большинстве случаев, вероятно, является оксюмороном.

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

Оптимизация — это то, что делает JVM жизнеспособными в качестве среды для долго работающих приложений. Можно быть уверенным, что SUN, IBM и ее друзья делают все возможное, чтобы гарантировать, что они смогут максимально эффективно оптимизировать ваш байт-код и JIT-скомпилированный код.

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

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

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

Компилятор HotSpot оптимизирует ваш код во время выполнения лучше, чем это возможно во время компиляции — в конце концов, у него больше информации для работы.Единственный раз, когда вам следует оптимизировать байт-код, а не только свой алгоритм, — это когда вы ориентируетесь на мобильные устройства, такие как Blackberry, где JVM для этой платформы недостаточно мощна для оптимизации кода во время выполнения и просто выполняет байт-код.

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

Примечание Асерафиму:

В некоторых ограниченных случаях также может быть полезно оптимизировать байт-код для невстроенных приложений:

  1. При доставке кода по сети, например для приложений WebStart, чтобы минимизировать размер результатов/кэша, а также потому, что вам не обязательно известны возможности/скорость клиента.

  2. Для кода, который, как вы знаете, критичен к производительности и используется при запуске до того, как (скажем) HotSpot успел собрать какую-либо статистику.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top