Почему JIT-компилятор Java не переводит все в нативный код? - PullRequest
4 голосов
/ 18 августа 2011

Я искал компилятор Java JIT и не могу понять, почему часть кода все еще интерпретируется. Почему JIT-компилятор не переводит все в нативный код? Интерпретация намного медленнее, я что-то упустил?

Ответы [ 3 ]

5 голосов
/ 18 августа 2011

Все зависит от компромиссов

  • время, необходимое для компиляции + выполнения кода, может быть дольше, чем время для интерпретации один раз
  • , часто вы можете оптимизировать вещи гораздо эффективнее, еслиу вас есть статистика ветвления и т. д.
  • некоторые вещи не могут быть скомпилированы (что-нибудь, что делает RTTI, вероятно)
  • некоторые вещи, которые вы не хотите компилировать (номера строк для трассировки стека и т. д.)
  • Я уверен, что есть и другие.
3 голосов
/ 18 августа 2011

Если вы используете JVM, например HotSpot, он JIT-компилируется оппортунистически, концентрируясь только на коде, который часто выполняется. Он определяет, какой код оптимизировать на лету, подсчитывая частоту каждого кодового блока (или метод - я не уверен, какой). Следовательно, во время запуска все интерпретируется.

Цель этого состоит в том, чтобы обеспечить более агрессивную и дорогостоящую оптимизацию, требуя лишь небольшой части кода для оптимизации.

2 голосов
/ 09 марта 2012

Две основные причины:

  • Интерпретация не замедляется, если код запускается всего несколько раз.Одна только стоимость компиляции может быть намного дороже, чем интерпретация кода, если он запускается только несколько раз.
  • При интерпретации можно собирать статистику во время выполнения, которая будет полезна для оптимизации кода позже.Например, вы можете подсчитать, сколько раз берется определенная ветка, и оптимизировать код, чтобы он был быстрее для более частого случая.Такая хитрость может сделать JIT-компиляцию лучше, чем преждевременная (которая не имеет возможности использовать статистику времени выполнения)

Следовательно, Java JIT использует разумную стратегию: don '• компилируйте, пока не увидите, что один и тот же код выполняется несколько раз, и в этот момент у вас есть доказательства того, что компиляция, вероятно, стоит того, и вы можете внести некоторые дополнительные оптимизации.

...