Что делает JIT-компилятор?
Я просто смотрел видео Google IO, и они говорили о компиляторе JIT, который они включили в android. Они показали демонстрацию улучшений производительности благодаря JIT-компилятору. Я задавался вопросом, что именно делает JIT-компилятор, и хотел услышать от разных людей.
Итак, в чем заключается обязанность JIT-компилятора?
9 ответов:
Код Java обычно распространяется как байт-код, который является машинно-независимым псевдокодом. (Эта же идея ранее использовалась в системеUCSD-p, разработанной в 70-х годах.) Преимуществом этого является то, что одно и то же приложение может быть запущено в разных процессорах и операционных системах. Кроме того, байт-код часто меньше, чем скомпилированное приложение.
Недостатком является то, что интерпретация кода является медленной по сравнению с запуском скомпилированного кода. Решить это задача, был разработан JIT-компилятор. JIT-компилятор компилирует код в машинный код непосредственно перед его выполнением. Это ускоряет выполнение по сравнению с интерпретатором, но при каждом запуске программы тратится дополнительное время на компиляцию. Кроме того, поскольку JIT-компилятор должен компилироваться быстро, он не может использовать сложные методы оптимизации, которые используются в статических компиляторах.Другой подход-компиляцияHotSpot . Сначала он работает как интерпретатор, но затем определяет, какие подпрограммы используются чаще всего, и компилирует только их. Преимущество заключается в том, что отсутствует начальная задержка из-за компиляции. Кроме того, компилятор HotSpot может выполнять профилирование во время выполнения, а затем выполнять более сильную оптимизацию для наиболее важных подпрограмм. Он может даже собирать информацию, так что при запуске одного и того же приложения снова и снова, оно будет работать все быстрее и быстрее. Дополнительную информацию о компиляции HotSpot можно найти в этой статье (tnx Pangea for ссылка).
Конечно, вместо использования JIT-компилятора, вы можете просто использовать статический компилятор для компиляции байт-кода для вашей машины. Это обеспечивает полную оптимизацию, и тогда вам не нужно будет компилировать снова каждый раз, когда вы запускаете приложение. Однако в телефонах и веб-страницах вы часто просто выполняете код (или апплет) один раз, поэтому JIT-компилятор может быть лучшим выбором.
Обновить
Файлы байт-кода Python имеют расширение. py. при выполнении файла байт-кода, Python JIT-компилятор создает скомпилированный файл .пик. В следующий раз, когда вы запустите ту же программу, если файл. py не изменился, нет необходимости компилировать его снова, но вместо этого Python запускает ранее скомпилированный .файл pyc. Это ускоряет запуск программы.
JIT-это сокращение от "как раз вовремя". JIT-компилятор компилирует код, который часто находится на промежуточном языке, таком как байт-код Java или Microsoft IL, в собственный исполняемый код, и он делает это в тот момент, когда код вызывается. Таким образом, пока код не вызван, он существует только в переносимом, не машинном байт-коде или IL, а затем, когда он вызывается, генерируется машинный код (который затем повторно используется при последующих вызовах).
Это компилятор just-in-time, находящийся на полпути между интерпретатором и компилятором (то есть он компилируется, но только непосредственно перед выполнением кода).
Это позволяет оптимизировать компиляцию с использованием динамической информации, известной только во время выполнения (поскольку компиляторы обычно работают статически и поэтому имеют доступ только к информации о времени компиляции). Они намного сложнее в написании, но могут дать большие улучшения производительности.
Для получения дополнительной информации, как всегда, см. Википедия :
В вычислительной технике just-in-time compilation (JIT), также известный как dynamic translation, представляет собой метод повышения производительности выполнения компьютерной программы. Традиционно компьютерные программы имели два режима работы во время выполнения: интерпретируемую или статическую (опережающую) компиляцию. Интерпретируемый код переводился с языка высокого уровня на машинный код непрерывно во время каждого выполнения, в то время как статическая компиляция переводила код в машинный код перед исполнением, и только требовал этот перевод один раз.
JIT-компиляторы представляли собой гибридный подход, при котором перевод происходил непрерывно, как и с интерпретаторами, но с кэшированием переведенного кода для минимизации снижения производительности. Он также предоставляет другие преимущества по сравнению со статически скомпилированным кодом во время разработки, такие как обработка типов данных с запоздалой привязкой и возможность обеспечения гарантий безопасности.
JIT = как раз вовремя. Это процесс, при котором программа, которая в противном случае была бы интерпретирована (например, байт-код Java или код Javascript), преобразуется в машинный код на лету, когда она работает для повышения производительности.
Некоторые преимущества заключаются в том, что JIT-компилятор может видеть горячие точки и применять более агрессивные оптимизации, он также может использовать любые расширения, которые есть у текущего процессора, такие как SSE2.
Этот вопрос может содержать дополнительную информацию: как JIT-компилятор помогает производительность приложений?
Итак, в чем заключается обязанность Джита компилятор?
Как упоминали другие, это сокращение от "Just In Time", что в этом смысле означает"как раз вовремя для исполнения".
При компиляции программ в машинный код они часто ориентированы на определенную платформу.
Поэтому JIT был "изобретен", вы хотите скомпилировать последние биты и куски вашего кода для исполняющей платформы, поэтому смотрите это как "до exection " - компилятор / оптимизатор.
JIT делает нашу жизнь проще и заставляет (надеюсь) наши приложения работать быстрее.
Есть, конечно, и другие цели JIT-компиляции, приведенное выше-лишь одна из них.
Довольно хорошее объяснение:
" на практике методы не компилируются при первом вызове. Для каждого метода JVM поддерживает счетчик вызовов, который увеличивается при каждом вызове метода. JVM интерпретирует метод до тех пор, пока число его вызовов не превысит порог компиляции JIT. Поэтому часто используемые методы компилируются вскоре после запуска JVM, а менее используемые методы компилируются намного позже или вообще не компилируются. Порог компиляции JIT помогает JVM начните быстро и все еще улучшайте производительность. Порог был тщательно выбран, чтобы получить оптимальный баланс между временем запуска и долгосрочной производительностью.
После компиляции метода его количество вызовов сбрасывается до нуля, а последующие вызовы метода продолжают увеличивать его количество. Когда число вызовов метода достигает порога перекомпиляции JIT, компилятор JIT компилирует его во второй раз, применяя больший выбор оптимизаций, чем в предыдущем случае. сборник. Этот процесс повторяется до тех пор, пока не будет достигнут максимальный уровень оптимизации. самые загруженные методы Java-программы всегда оптимизируются наиболее агрессивно, максимизируя преимущества производительности при использовании JIT-компилятора.JIT-компилятор может также измерять рабочие данные во время выполнения и использовать эти данные для улучшения качества дальнейших перекомпиляций.
JIT-компилятор можно отключить, и в этом случае будет интерпретирована вся программа Java. Отключение JIT компилятор не рекомендуется использовать, кроме как для диагностики или обхода проблем компиляции JIT."
JIT-компилятор обычно является последней частью конвейера виртуальной машины и генерирует машинный код из промежуточного языка виртуальной машины.
Он повышает скорость работы за счет оптимизации сгенерированного кода для среды, в которой он выполняется (конкретные инструкции процессора, размер кэша,...).
Традиционные компиляторы также оптимизируют созданный машинный код, но они должны делать это, не зная о конкретных ресурсах, которые будут доступны во время выполнения.
Компилятор Just-In-Time (JIT) - это компонент среды выполнения Java™, повышающий производительность приложений Java во время выполнения.
Смотрите документацию IBM здесь.
Интерпретатор в основном делает это:
- прочитайте следующий байт-код, который будет выполнен
- посмотрите, что такое байт-код, и найдите соответствующие ему машинные инструкции
- выполнение собственных машинных команд
- перейти к шагу 1
Это просто, он хорошо работает, и он будет запускать вашу программу Java. Но это также неэффективно, потому что поиск собственных инструкций для каждого байт-кода, который должен быть выполнен, требует времени обработки. Таким образом, JVM содержит второй механизм, компилятор Just-In-Time, который в основном делает следующее:
- прочитайте все байт-коды для метода, который должен быть выполнен
- преобразуйте все эти байт-коды в собственные машинные инструкции
- Выполнить генерируемые собственные машинные инструкции
После преобразования байт-кодов метода в собственные машинные инструкции JVM запоминает этот машинный код, так что в следующий раз, когда метод должен быть запущен, он может просто запустить собственные инструкции - ему не нужно преобразовывать байт-коды каждый раз, когда метод выполняется. Это позволяет программе работать намного быстрее.
Кроме того, JIT выполняет множество оптимизаций для создания собственного кода, который выполняется как можно быстрее.
Сомнение Сэр, если javac является компилятором Java, его роль заключается в преобразовании исходного кода в байт-код .Класс и потом .класс (байт-код) интерпретируется интерпретатором Java (Java) средствами JVM и JIT является частью JVM, то какова его фактическая работа
Comments