Оптимизация 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-компилятора.