Почему интерпретатор с JIT генерирует более быстрые коды, чем без них? - PullRequest
2 голосов
/ 09 января 2012

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

Ответы [ 2 ]

20 голосов
/ 09 января 2012

Предположим, у вас есть цикл, который нужно выполнить миллион раз.

«Истинному» интерпретатору необходимо проверять его байт-код на каждой итерации цикла и выяснять, как код должен влиять на состояние системы (вызовы и т. Д.).

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

Чтобы привести пример из реальной жизни: если у вас был роман на английском языке, и некоторые французы, которые интересовались им, вы могли бы отдать книгу кому-то, кто знал оба языка, кто мог ее прочитать. вслух каждому человеку индивидуально. Или вы можете заставить этого человека забрать книгу, перевести ее на французский, а затем дать каждому французу копию книги на французском языке. Если книга интересует только одного человека, то оперативный перевод более эффективен - нет необходимости в редакторе, специалисте по верстке, принтере и т. Д., Но если у вас есть много людей, которые хотят прочитайте книгу, а затем сделайте более тщательный одноразовый перевод имеет больше смысла.


1 Некоторые JIT, в том числе в HotSpot, на самом деле JIT-компилируют один и тот же код несколько раз с разными уровнями оптимизации, в зависимости от использования.

1 голос
/ 09 января 2012

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

...