JIT против компиляции AOT

Этот вопрос связан с системой Android. Dalvik VM использует концепцию JIT, это означает, что при первом запуске приложения Dalvik VM компилирует его и загружает в ОЗУ до тех пор, пока он может остаться там. Я понимаю эту концепцию. Но новая виртуальная машина под названием ART использует метод AOT. ART компилирует приложение после его установки (или когда вы его устанавливаете?). Что это значит? Приложения, составленные ART, являются такими же, как и уже скомпилированные приложения (например, приложения C), но работают в отдельных процессах, отделенных от остальной ОС? Может ли кто-нибудь более подробно объяснить мне эти понятия. Мне нужно сделать презентацию, и это упоминается там, но я не понимаю эту концепцию, и я не хочу выглядеть глупым, если кто-то спрашивает меня об этом:) Извините за плохой английский, было бы неплохо, если бы кто-нибудь мог немного изменить вопрос.

Ответы

Ответ 1

Я не совсем знаю, как Dalvik JIT на Android работает на практике, потому что JIT имеет несколько вариантов, как можно работать.

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

Второй вариант заключается в том, что JIT работает как реальный Just-In-Time, что означает, что перевести блок кода, когда он начнет запускаться. При запуске всего приложения не транслируется, но только основная функция транслируется при запуске, а затем транслируется во время запуска, когда используется определенный блок кода (функция и т.д.). Эта опция потребляет меньше памяти, но приложение работает намного медленнее во время работы.

Согласно информации, которую я нашел, Android использует первый вариант. Приложение переводится на запуск, после чего оно выполняется "почти" изначально. И это "почти" делает основное различие между JIT и AOT.

Когда вы собираетесь запускать какое-либо приложение, JIT имеет ограниченное время для компиляции всего байт-кода в инструкции процессора, чтобы сделать "задержку" "приемлемой" долгой. Это означает, что он может выполнять только базовые оптимизации. Однако, когда вы устанавливаете какое-то приложение, у вас обычно больше времени, чтобы тратить время, и вы делаете это только один раз, а не при каждом запуске. Это означает, что компилятор AOT имеет гораздо больше времени для поиска трюков, как оптимизировать это приложение. Результирующий код должен быть более "эффективным". Второе преимущество заключается в том, что скомпилированное приложение хранится в кеше, и только часть его может быть загружена в память при запуске. Это означает, что ОС не сохранила весь код в памяти и может сохранить его. И это основные различия.

И последняя часть вашего вопроса - ART на Android выполнит компиляцию при установке (после сохранения apk в /data/app/ ). Однако, если вы протрите этот кеш или переключитесь с Dalvik на ART, он скомпилирует все установленное приложение при первой загрузке, что может занять 10 или даже больше минут.

И извините за мой плохой английский тоже, я чешский: -)