Что может сделать JIT-компилятор, чего не может AOT-компилятор? - PullRequest
0 голосов
/ 25 сентября 2018

Компилятор Just-in-Time (JIT) может оптимизировать программу на основе информации времени выполнения, недоступной для компилятора Ahead-of-Time (AOT).

Наиболее очевидный пример этой информации времени выполненияявляется целевой платформой, например, точным процессором, на котором работает программа, или любыми ускорителями, такими как графические процессоры, которые могут быть доступны.В этом смысле OpenCL компилируется JIT.

Но предположим, что мы заранее знаем, какова целевая платформа: мы знаем, какие расширения SIMD будут доступны и т. Д. Какая другая информация времени выполнения может быть JITэксплойт, который недоступен для AOT-компилятора?

JIT-компилятор в стиле HotSpot автоматически оптимизирует горячие точки программы ... но не может AOT-компилятор просто оптимизировать всю программу, hotпятна и все?

Я хотел бы привести некоторые примеры конкретных оптимизаций, которые JIT-компилятор может выполнять, чего не может AOT-компилятор.Бонусные баллы, если вы можете предоставить какие-либо доказательства эффективности такой оптимизации в сценариях «реального мира».

Ответы [ 3 ]

0 голосов
/ 26 сентября 2018

Что может сделать JIT-компилятор, чего не может компилятор AOT?

Теоретически;ничего, потому что AOT-компилятор может вставить JIT-компилятор в результирующий код, если он хочет (и / или может сгенерировать самоизменяющийся код, сгенерировать 123 альтернативные версии и выбрать, какую версию использовать на основе информации времени выполнения, ...).

На практике;AOT-компилятор ограничен тем, насколько сложен разработчик компилятора, с каким языком он компилируется и как используется компилятор.Например, некоторые компиляторы (ICC от Intel) генерируют несколько версий кода и (во время выполнения) решают, какую версию использовать, исходя из того, на каком процессоре он работает, но большинство компиляторов не предназначены для этого;многие языки не предоставляют никакого способа управления «локальностью» (и уменьшают вероятность пропусков TLB и кеша);и часто компилятор используется таким образом, что создает барьеры, препятствующие оптимизации (например, отдельные «единицы компиляции» / объектные файлы, которые связаны позже, возможно, включая динамическое связывание, когда компилятор AOT не может выполнить полную оптимизацию программы и толькоможно оптимизировать детали в изоляции).Все эти вещи являются деталями реализации, а не ограничением AOT.

Другими словами;на практике «AOT vs. JIT» - это сравнение реализаций, а не настоящее сравнение самого «AOT vs. JIT»;и на практике AOT дает низкую производительность из-за подробностей реализации, а JIT дает явно хуже, чем плохую производительность, потому что сам JIT плох (дорогие оптимизации вообще не жизнеспособны, потому что они выполняются во время выполнения);и единственная причина, по которой JIT кажется «почти таким же хорошим», заключается в том, что он «почти так же хорош, как и плохой».

0 голосов
/ 26 сентября 2018

JIT может оптимизировать на основе информации времени выполнения, что приводит к более жестким граничным условиям, которые не были доказаны во время компиляции.Примеры:

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

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

Прогноз ветвления можно улучшить с помощью обычных компиляторов, если программа компилируется дважды, с промежуточным тестовым прогоном;при первом запуске код инструментируется так, что он генерирует данные профилирования, которые используются в прогоне производственной компиляции для оптимизации прогнозирования ветвлений.Прогноз также менее чем оптимален, если тестовый запуск не был типичным (и не всегда легко вывести типичные тестовые данные, или шаблоны использования могут измениться в течение срока службы программы).

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

0 голосов
/ 26 сентября 2018

Одним из преимуществ является то, что JIT-компиляторы могут непрерывно профилировать код и оптимизировать вывод, например выравнивать / выравнивать некоторые блоки кода, не оптимизировать некоторые функции, переупорядочивать ветви для уменьшения неправильных прогнозов ...

Конечно, AoTкомпиляторы также могут выполнять оптимизацию на основе профилей, но они ограничены в тестовых примерах, выполняемых разработчиками и тестировщиками, которые могут не отражать динамический характер реальных входных данных

Например, Android вернулся из AoT-только когда они внедрили ART в Kitkat для гибридного подхода в Nougat и более поздних версиях, где некоторые части приложения быстро скомпилированы заранее с меньшим количеством оптимизаций, а затем после запуска результаты профиля будут снова использованы для оптимизации приложения, покателефон заряжается

Android 7.0 Компания Nougat представила JIT-компилятор с профилированием кода для ART, что позволяет ему постоянно повышать производительность приложений Android во время их работы.JIT-компилятор дополняет текущий компилятор Ahead of Time ART и помогает повысить производительность во время выполнения. [9]

https://en.wikipedia.org/wiki/Android_Runtime

Некоторые связанные вопросы:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...