2016-10-31 5 views
3

В Marshmallow был добавлен компилятор AOT с ART. С Android N еще один компилятор JIT добавлен в дополнение к AOT.Разница между AOT и JIT компилятором android

Мой вопрос в том, что такое задание/функции компилятора AOT и что такое работа/функции компилятора JIT.

ответ

2

Компиляторам требуется две вещи для генерации кода исполнителей: информация и ресурсы.

Составители JIT имеют больше информации в своем распоряжении, чем компиляторы AOT. Статический анализ невозможен в общем случае (почти все, что вы хотели бы знать о программе, можно свести к проблеме остановки или теореме Райса) и трудно даже в частном случае. У JIT-компиляторов нет этой проблемы: им не нужно статически анализировать программу, они могут наблюдать ее динамически во время выполнения.

Плюс, JIT-компилятор имеет в своем распоряжении методы, которые компиляторы AOT не делают, наиболее важным является де-оптимизация. Теперь вы можете подумать, что мы де-оптимизации важны для производительности? Ну, если вы можете де-оптимизировать, тогда вы можете быть чрезмерно агрессивными при создании оптимизаций, которые фактически недействительны (например, встраивание вызова метода, который может быть или не быть полиморфным), и если окажется, что вы ошибаетесь, вы можете затем отмените оптимизацию обратно в un-inlined case (например).

Однако проблема с ресурсами: компилятор AOT может занять столько времени, сколько захочет, и использовать столько памяти, сколько захочет. Компилятор JIT должен украсть свои ресурсы от самой программы, которую пользователь хочет использовать прямо сейчас.

Как правило, это не проблема. Наши сегодняшние машины настолько смехотворно перегружены, что в распоряжении JIT всегда достаточно ресурсов. Тем более, что JIT будет использовать большинство ресурсов, когда сразу вводится много нового кода, что обычно происходит во время запуска программы или когда программа переходит между этапами (например, от разбора файлов конфигурации до настройки графа объектов или от завершения настройки до начала фактической работы), и в это время сама программа, как правило, еще не использует много ресурсов (особенно во время запуска программы). Хорошим примером является Azul JCA. Он имеет 864 ядра и 768 GiByte RAM в своей самой большой конфигурации (и обратите внимание, что они не были проданы в течение довольно продолжительного времени, так что это на самом деле несколько лет технология). Согласно измерениям Азуля, JIT использует, возможно, 50 ядер, когда он работает очень тяжело. Это еще больше, чем 800 ядер для программы, системы и GC.

Но ваше типичное Android-устройство не имеет 1000 ядер и TiByte оперативной памяти. И он чрезвычайно интерактивен и чувствителен к задержкам, когда пользователь начинает, скажем, WhatsApp, он хочет написать сообщение прямо сейчас. Не в 500 мсек, когда JIT разогрелся. ТЕПЕРЬ.

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

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

0

В классах Java Java, преобразованных в байт-код DEX. Формат байт-кода DEX переведен на собственный машинный код через ART или во время автономной работы Dalvik.

Dalvik - это JIT (как раз вовремя) сборник на основе двигателя. Были недостатки, чтобы использовать Dalvik, следовательно, из Android 4.4 (kitkat) ART был представлен как среда исполнения, а с Android 5.0 (Lollipop) у него полностью заменен Dalvik. Android 7.0 добавляет компилятор «точно в срок» (JIT) с профилированием кода в Android runtime (ART), который постоянно улучшает производительность приложений для Android при их запуске.

(Dalvik используется JIT (Just In Time) компиляция, тогда как АРТ использует AOT (досрочно) составление.)

Just In Time (JIT):

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

впереди времени (AOT):

АРТ оснащен Впереди-из-Time компилятор. На этапе установки приложения он статически переводит байт-код DEX в машинный код и хранит в памяти устройства. Это одноразовое событие, которое происходит, когда приложение установлено на устройстве.

Android N включает в себя гибридное выполнение:

Там не будет компиляция во время установки и приложения могут быть запущены сразу же, байт-кода интерпретируются. В АРТ есть новый, более быстрый переводчик, и он сопровождается новым JIT, но информация JIT не сохраняется. Вместо этого код профилируется во время выполнения, и приведенные данные сохраняются.

Преимущества АРТ:

  • приложения работать быстрее, так как DEX байт-код перевода, выполненного во время установки.
  • Сокращает время запуска приложений в качестве собственного кода.
  • Повышает эффективность работы от батареи, поскольку энергия, используемая для интерпретации байтовых строк, сохраняется.
  • Улучшенный сборщик мусора.

Недостатки АРТ:

  • App Установка занимает больше времени из-за DEX байт-код преобразования в машинный код во время установки.

  • Поскольку встроенный машинный код, сгенерированный при установке, хранится во внутреннем хранилище, требуется большее внутреннее хранилище.