Оптимизация Java: только байт-код против JIT

Разрабатывая игры для устройств Android, мне нужно ориентироваться на устройства, у которых вообще нет JIT, и полагаться только на оптимизацию байт-кода. Интересно, набор этих оптимизаций пуст или нет...

На самом деле, делает ли java-компилятор (сложный, javac, а не JIT) какую-либо оптимизацию, например, преобразование / 4 в >> 2? Или каждая оптимизация - это работа для JIT?

2 ответа

Решение

Стандартный компилятор Java выполняет некоторые оптимизации, но оставляет большинство из них для JIT.

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

Я не знаю, что делает компилятор Google, когда он переводит ваш байт-код Java в код Dalvik - возможно, он выполняет более обширные оптимизации.

Может быть, этот инструмент будет вам полезен: Оптимизация и проверка Dalvik с помощью dexopt

Кстати, приведенный вами пример не всегда верен; превращение a / 4 в a >> 2 не гарантируется, что ваша программа будет работать быстрее на любом процессоре. Однажды я где-то читал статью (извините, не могу найти ее прямо сейчас...), в которой объясняется (на мой взгляд) на современных процессорах x86, a >> 2 может быть даже медленнее, чем a / 4,

В любом случае, не делайте преждевременных оптимизаций, таких как преобразование a / 4 в a >> 2 вручную в исходном коде, если у вас нет реальных доказательств (из измерений производительности), что это стоит делать.

Если ваша исполняющая платформа действительно выполняет байт-коды, ваша интуиция о таких вещах, как a / 4 быть быстрее чем a >> 2 скорее всего, будут неправы. Вам нужно выполнить серьезное профилирование приложения, чтобы выяснить:

  • стоит ли вообще оптимизировать,
  • где сосредоточить свои усилия, и
  • какие (микро) оптимизации на самом деле работают.

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

Другие вопросы по тегам