2011-01-27 5 views
6

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

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

+0

Деление против левого сдвига не влияет на общую скорость программы. Не малейший бит. – delnan

ответ

7

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

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

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

Может быть, этот инструмент будет полезен для вас: Dalvik Optimization and Verification With dexopt

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

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

+0

Спасибо (вам обоим). Я не делаю никакой микро-оптимизации, мне нравится удобство чтения, но было просто интересно, будут ли устройства без JIT страдать от всякого возможного греха или если тривиальная оптимизация была выполнена компилятором. Как вы отметили, мой пример не такой тривиальный ... был плохим. –

2

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

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

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

Смежные вопросы