Оптимизация Java: только байт-код против JIT - PullRequest
6 голосов
/ 27 января 2011

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

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

Ответы [ 2 ]

7 голосов
/ 27 января 2011

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

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

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

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

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

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

2 голосов
/ 27 января 2011

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

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

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

...