codefest 2012. Липский Н. — jit vs. aot. Единство и борьба...
DESCRIPTION
TRANSCRIPT
![Page 1: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java](https://reader034.vdocuments.net/reader034/viewer/2022050919/5478ea825906b58f048b4627/html5/thumbnails/1.jpg)
JIT vs. AOT
Единство и борьба динамического и
статического компиляторов для Java
Никита Липский
Excelsior
![Page 2: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java](https://reader034.vdocuments.net/reader034/viewer/2022050919/5478ea825906b58f048b4627/html5/thumbnails/2.jpg)
![Page 3: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java](https://reader034.vdocuments.net/reader034/viewer/2022050919/5478ea825906b58f048b4627/html5/thumbnails/3.jpg)
Интерпретатор vs.
Компилятор
• Интерпретатор исполняет
программу сразу
• Компилятор транслирует
программу в машинный код
![Page 4: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java](https://reader034.vdocuments.net/reader034/viewer/2022050919/5478ea825906b58f048b4627/html5/thumbnails/4.jpg)
Java to Java Bytecode
• Программа на языке Java
транслируется в Java bytecode
• JVM – исполняет Java bytecode
![Page 5: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java](https://reader034.vdocuments.net/reader034/viewer/2022050919/5478ea825906b58f048b4627/html5/thumbnails/5.jpg)
Исполнение
Java байткода JVM
• Интерпретация
• Компиляция в машинный код и
исполнение на “железе”
![Page 6: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java](https://reader034.vdocuments.net/reader034/viewer/2022050919/5478ea825906b58f048b4627/html5/thumbnails/6.jpg)
Трансляция Java to Native
• Динамическая (Just-In-Time – JIT).
– Трансляция происходит во время
исполнения программы
• Статическая (Ahead-Of-Time – AOT)
– Трансляция происходит до исполнения
программы
![Page 7: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java](https://reader034.vdocuments.net/reader034/viewer/2022050919/5478ea825906b58f048b4627/html5/thumbnails/7.jpg)
![Page 8: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java](https://reader034.vdocuments.net/reader034/viewer/2022050919/5478ea825906b58f048b4627/html5/thumbnails/8.jpg)
Java vs. C/C++
• Умолчательный компилятор в
машинный код для Java – динамический
• Умолчательный компилятор в
машинный код для С/С++ – статический
![Page 9: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java](https://reader034.vdocuments.net/reader034/viewer/2022050919/5478ea825906b58f048b4627/html5/thumbnails/9.jpg)
Мифы вокруг статической
компиляции Java
![Page 10: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java](https://reader034.vdocuments.net/reader034/viewer/2022050919/5478ea825906b58f048b4627/html5/thumbnails/10.jpg)
Миф 1.
Java - динамическая
• Reflection
• Динамическая загрузка
Статическая компиляция невозможна?
![Page 11: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java](https://reader034.vdocuments.net/reader034/viewer/2022050919/5478ea825906b58f048b4627/html5/thumbnails/11.jpg)
Миф 2. Машинный код –
убийца WORA
WORA: Write Once Run Anywhere
(пиши раз, исполняй везде)
!= BORA: Build Once?
(собирай раз??? …)
![Page 12: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java](https://reader034.vdocuments.net/reader034/viewer/2022050919/5478ea825906b58f048b4627/html5/thumbnails/12.jpg)
Миф 3. JIT быстрее
Динамический профиль исполнения
РУЛИТ!
Или не рулит?
![Page 13: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java](https://reader034.vdocuments.net/reader034/viewer/2022050919/5478ea825906b58f048b4627/html5/thumbnails/13.jpg)
Миф 4. AOT быстрее
Машинный код со старта
РУЛИТ!
![Page 14: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java](https://reader034.vdocuments.net/reader034/viewer/2022050919/5478ea825906b58f048b4627/html5/thumbnails/14.jpg)
Java динамическая?
![Page 15: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java](https://reader034.vdocuments.net/reader034/viewer/2022050919/5478ea825906b58f048b4627/html5/thumbnails/15.jpg)
Бинарная совместимость
Позволяет менять один “слегка”
изменившийся класс независимо от
“окружения”
– Замена кода на лету (hotswapping)
– Маленькие обновления
![Page 16: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java](https://reader034.vdocuments.net/reader034/viewer/2022050919/5478ea825906b58f048b4627/html5/thumbnails/16.jpg)
Пользовательские
загрузчики классов
• Умолчательная логика загрузки
провоцирует JAR Hell
![Page 17: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java](https://reader034.vdocuments.net/reader034/viewer/2022050919/5478ea825906b58f048b4627/html5/thumbnails/17.jpg)
Пользовательские
загрузчики классов
![Page 18: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java](https://reader034.vdocuments.net/reader034/viewer/2022050919/5478ea825906b58f048b4627/html5/thumbnails/18.jpg)
Время старта приложения
![Page 19: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java](https://reader034.vdocuments.net/reader034/viewer/2022050919/5478ea825906b58f048b4627/html5/thumbnails/19.jpg)
Холодный старт vs
теплый
Во второй раз приложение стартует
значительно быстрее, чем в первый
– Загрузка кода и данных приложения с
диска
– Загрузка системных и сторонних
динамических библиотек (dll, so)
![Page 20: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java](https://reader034.vdocuments.net/reader034/viewer/2022050919/5478ea825906b58f048b4627/html5/thumbnails/20.jpg)
Java Quick Start
• Java Quick Start
– Предзагружает rt.jar, динамические
библиотеки
![Page 21: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java](https://reader034.vdocuments.net/reader034/viewer/2022050919/5478ea825906b58f048b4627/html5/thumbnails/21.jpg)
AOT быстрее?
• Машинный код “толще” Java bytecode
• Загрузка кода с диска занимает
больше времени, чем его начальное
исполнение
![Page 22: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java](https://reader034.vdocuments.net/reader034/viewer/2022050919/5478ea825906b58f048b4627/html5/thumbnails/22.jpg)
AOT быстрее!
• Код исполняемый на старте – в начало
«экзешника»
• Можно предзагружать стартовый
сегмент последовательным чтением
![Page 23: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java](https://reader034.vdocuments.net/reader034/viewer/2022050919/5478ea825906b58f048b4627/html5/thumbnails/23.jpg)
Оптимизации
![Page 24: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java](https://reader034.vdocuments.net/reader034/viewer/2022050919/5478ea825906b58f048b4627/html5/thumbnails/24.jpg)
• Зависят от выбора внутреннего представления
• Часто невозможны без предварительного анализа программы
• Качество оптимизаций зависит от мощи/точности анализа
Оптимизации
![Page 25: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java](https://reader034.vdocuments.net/reader034/viewer/2022050919/5478ea825906b58f048b4627/html5/thumbnails/25.jpg)
– Протяжка констант
– Удаление избыточного кода
– Удаление общих подвыражений
– Открытая подстановка
– Специализация методов
– Развертывание циклов
– Версионирование циклов
– Вынос инвариантов
– Удаление хвостовой рекурсии
– Девиртуализация вызовов
– Аллокация объектов на стэке и их взрыв
– Удаление проверок времени исполнения
– Удаление избыточной синхронизации
– Оптимальная выборка кода и свертка шаблонов
– Планировка инструкций
– Оптимальное распределение регистров
Оптимизации
• Виды оптимизаций
• На каком внутреннем представлении и с помощью каких анализов?
![Page 26: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java](https://reader034.vdocuments.net/reader034/viewer/2022050919/5478ea825906b58f048b4627/html5/thumbnails/26.jpg)
Анализ потока данных
• Протяжка констант
• Удаление общих подвыражений
• Оптимальное распределение регистров.
• И многое другое
![Page 27: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java](https://reader034.vdocuments.net/reader034/viewer/2022050919/5478ea825906b58f048b4627/html5/thumbnails/27.jpg)
Java – ООП
• Много методов
• Методы маленькие (get/set)
• Методы по умолчанию
ВИРТУАЛЬНЫЕ
![Page 28: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java](https://reader034.vdocuments.net/reader034/viewer/2022050919/5478ea825906b58f048b4627/html5/thumbnails/28.jpg)
Девиртулизация
вызовов
• Предусловие дальнейшей открытой
подстановки (inline)
• Анализ иерархии классов
– метод не перегружается – невиртульный
• Типовый анализ
– new T().foo(); //вызов foo() невиртульный
![Page 29: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java](https://reader034.vdocuments.net/reader034/viewer/2022050919/5478ea825906b58f048b4627/html5/thumbnails/29.jpg)
Аллокация объектов
на стэке
• Все Java объекты создаются в динамической
памяти – Java heap (куча)
• Большинство объектов временные
• Хочется их размещать на стэке метода
• Escape анализ (анализ утечек) –
определяет утекает ли объект в
разделяемую память.
![Page 30: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java](https://reader034.vdocuments.net/reader034/viewer/2022050919/5478ea825906b58f048b4627/html5/thumbnails/30.jpg)
Глобальный анализ
• Типовый и Escape анализы боятся
вызовов, особенно виртуальных.
• Глобальный анализ – анализирует все
методы программы, в частности
уточняя типовый и escapе анализы.
![Page 31: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java](https://reader034.vdocuments.net/reader034/viewer/2022050919/5478ea825906b58f048b4627/html5/thumbnails/31.jpg)
Анализы и оптимизации
• Часто бывают довольно сложными
• Требуют итеративного пересчета
• Глобальный анализ зависит от ВСЕЙ
программы.
![Page 32: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java](https://reader034.vdocuments.net/reader034/viewer/2022050919/5478ea825906b58f048b4627/html5/thumbnails/32.jpg)
Анализы и оптимизации
• Часто бывают довольно сложными
• Требуют итеративного пересчета
• Глобальный анализ зависит от ВСЕЙ
программы.
Все ли это может
себе позволить JIT?
![Page 33: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java](https://reader034.vdocuments.net/reader034/viewer/2022050919/5478ea825906b58f048b4627/html5/thumbnails/33.jpg)
Динамические
оптимизации
• Профилировка и селективная компиляция
• Открытая подстановка на основе профиля исполнения
• Оптимизация трасс
исполнения
• Выбор оптимальных инструкций
![Page 34: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java](https://reader034.vdocuments.net/reader034/viewer/2022050919/5478ea825906b58f048b4627/html5/thumbnails/34.jpg)
Динамические
оптимизации
Может ли статический компилятор
использовать динамический профиль
исполнения?
![Page 35: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java](https://reader034.vdocuments.net/reader034/viewer/2022050919/5478ea825906b58f048b4627/html5/thumbnails/35.jpg)
Горячий код vs теплый
• А что будет, если у приложения нет
ярко выраженного горячего кода?
• Долгий прогрев, результаты прогрева
не используются при дальнейших
стартах приложения
![Page 36: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java](https://reader034.vdocuments.net/reader034/viewer/2022050919/5478ea825906b58f048b4627/html5/thumbnails/36.jpg)
Не кодом единым …
• Кроме кода приложения, есть еще код JVM
– Управление памятью
– Сборка мусора
– Потоки и синхронизация
– Обработка исключительных ситуаций
– …
• Кроме Java кода, есть сторонний код
– Native методы + нативные библиотеки (в т.ч. ОС)
![Page 37: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java](https://reader034.vdocuments.net/reader034/viewer/2022050919/5478ea825906b58f048b4627/html5/thumbnails/37.jpg)
А что сравниваем?
Динамические
компиляторы
HotSpot client
HotSpot server
JRockit
IBM J9
Java ME
.NET
Статические
компиляторы
GCJ
Excelsior JET
IBM J9
Java ME
.NET
![Page 38: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java](https://reader034.vdocuments.net/reader034/viewer/2022050919/5478ea825906b58f048b4627/html5/thumbnails/38.jpg)
А что сравниваем?
• Качество самой реализации влияет на
производительность приложения
– HotSpot server vs HotSpot client
– Java ME JIT vs Java ME AOT
– .NET JIT vs .NET AOT
– GCJ vs Excelsior JET
– HotSpot vs Excelsior JET
![Page 39: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java](https://reader034.vdocuments.net/reader034/viewer/2022050919/5478ea825906b58f048b4627/html5/thumbnails/39.jpg)
Будущее Java
• У беспроводных устройств есть
БАТАРЕЙКА
• Процессорное время в облаках дорого
![Page 40: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java](https://reader034.vdocuments.net/reader034/viewer/2022050919/5478ea825906b58f048b4627/html5/thumbnails/40.jpg)
Будущее Java
• У JIT и AOT есть свои преимущества
• Совмещение двух подходов даст
максимальный эффект
![Page 41: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java](https://reader034.vdocuments.net/reader034/viewer/2022050919/5478ea825906b58f048b4627/html5/thumbnails/41.jpg)
Для тех, кто в танке
![Page 42: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java](https://reader034.vdocuments.net/reader034/viewer/2022050919/5478ea825906b58f048b4627/html5/thumbnails/42.jpg)
Для тех, кто в танке
• Есть много JVM с уникальными
свойствами
• Статическая компиляция Java возможна
и дает преимущества
• Будущее за гибридным подходом