codefest 2012. Липский Н. — jit vs. aot. Единство и борьба...

43
JIT vs. AOT Единство и борьба динамического и статического компиляторов для Java Никита Липский Excelsior

Upload: codefest

Post on 28-Nov-2014

899 views

Category:

Documents


0 download

DESCRIPTION

 

TRANSCRIPT

Page 1: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java

JIT vs. AOT

Единство и борьба динамического и

статического компиляторов для Java

Никита Липский

Excelsior

Page 2: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java
Page 3: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java

Интерпретатор vs.

Компилятор

• Интерпретатор исполняет

программу сразу

• Компилятор транслирует

программу в машинный код

Page 4: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java

Java to Java Bytecode

• Программа на языке Java

транслируется в Java bytecode

• JVM – исполняет Java bytecode

Page 5: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java

Исполнение

Java байткода JVM

• Интерпретация

• Компиляция в машинный код и

исполнение на “железе”

Page 6: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java

Трансляция Java to Native

• Динамическая (Just-In-Time – JIT).

– Трансляция происходит во время

исполнения программы

• Статическая (Ahead-Of-Time – AOT)

– Трансляция происходит до исполнения

программы

Page 7: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java
Page 8: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java

Java vs. C/C++

• Умолчательный компилятор в

машинный код для Java – динамический

• Умолчательный компилятор в

машинный код для С/С++ – статический

Page 9: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java

Мифы вокруг статической

компиляции Java

Page 10: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java

Миф 1.

Java - динамическая

• Reflection

• Динамическая загрузка

Статическая компиляция невозможна?

Page 11: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java

Миф 2. Машинный код –

убийца WORA

WORA: Write Once Run Anywhere

(пиши раз, исполняй везде)

!= BORA: Build Once?

(собирай раз??? …)

Page 12: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java

Миф 3. JIT быстрее

Динамический профиль исполнения

РУЛИТ!

Или не рулит?

Page 13: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java

Миф 4. AOT быстрее

Машинный код со старта

РУЛИТ!

Page 14: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java

Java динамическая?

Page 15: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java

Бинарная совместимость

Позволяет менять один “слегка”

изменившийся класс независимо от

“окружения”

– Замена кода на лету (hotswapping)

– Маленькие обновления

Page 16: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java

Пользовательские

загрузчики классов

• Умолчательная логика загрузки

провоцирует JAR Hell

Page 17: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java

Пользовательские

загрузчики классов

Page 18: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java

Время старта приложения

Page 19: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java

Холодный старт vs

теплый

Во второй раз приложение стартует

значительно быстрее, чем в первый

– Загрузка кода и данных приложения с

диска

– Загрузка системных и сторонних

динамических библиотек (dll, so)

Page 20: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java

Java Quick Start

• Java Quick Start

– Предзагружает rt.jar, динамические

библиотеки

Page 21: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java

AOT быстрее?

• Машинный код “толще” Java bytecode

• Загрузка кода с диска занимает

больше времени, чем его начальное

исполнение

Page 22: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java

AOT быстрее!

• Код исполняемый на старте – в начало

«экзешника»

• Можно предзагружать стартовый

сегмент последовательным чтением

Page 23: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java

Оптимизации

Page 24: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java

• Зависят от выбора внутреннего представления

• Часто невозможны без предварительного анализа программы

• Качество оптимизаций зависит от мощи/точности анализа

Оптимизации

Page 25: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java

– Протяжка констант

– Удаление избыточного кода

– Удаление общих подвыражений

– Открытая подстановка

– Специализация методов

– Развертывание циклов

– Версионирование циклов

– Вынос инвариантов

– Удаление хвостовой рекурсии

– Девиртуализация вызовов

– Аллокация объектов на стэке и их взрыв

– Удаление проверок времени исполнения

– Удаление избыточной синхронизации

– Оптимальная выборка кода и свертка шаблонов

– Планировка инструкций

– Оптимальное распределение регистров

Оптимизации

• Виды оптимизаций

• На каком внутреннем представлении и с помощью каких анализов?

Page 26: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java

Анализ потока данных

• Протяжка констант

• Удаление общих подвыражений

• Оптимальное распределение регистров.

• И многое другое

Page 27: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java

Java – ООП

• Много методов

• Методы маленькие (get/set)

• Методы по умолчанию

ВИРТУАЛЬНЫЕ

Page 28: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java

Девиртулизация

вызовов

• Предусловие дальнейшей открытой

подстановки (inline)

• Анализ иерархии классов

– метод не перегружается – невиртульный

• Типовый анализ

– new T().foo(); //вызов foo() невиртульный

Page 29: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java

Аллокация объектов

на стэке

• Все Java объекты создаются в динамической

памяти – Java heap (куча)

• Большинство объектов временные

• Хочется их размещать на стэке метода

• Escape анализ (анализ утечек) –

определяет утекает ли объект в

разделяемую память.

Page 30: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java

Глобальный анализ

• Типовый и Escape анализы боятся

вызовов, особенно виртуальных.

• Глобальный анализ – анализирует все

методы программы, в частности

уточняя типовый и escapе анализы.

Page 31: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java

Анализы и оптимизации

• Часто бывают довольно сложными

• Требуют итеративного пересчета

• Глобальный анализ зависит от ВСЕЙ

программы.

Page 32: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java

Анализы и оптимизации

• Часто бывают довольно сложными

• Требуют итеративного пересчета

• Глобальный анализ зависит от ВСЕЙ

программы.

Все ли это может

себе позволить JIT?

Page 33: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java

Динамические

оптимизации

• Профилировка и селективная компиляция

• Открытая подстановка на основе профиля исполнения

• Оптимизация трасс

исполнения

• Выбор оптимальных инструкций

Page 34: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java

Динамические

оптимизации

Может ли статический компилятор

использовать динамический профиль

исполнения?

Page 35: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java

Горячий код vs теплый

• А что будет, если у приложения нет

ярко выраженного горячего кода?

• Долгий прогрев, результаты прогрева

не используются при дальнейших

стартах приложения

Page 36: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java

Не кодом единым …

• Кроме кода приложения, есть еще код JVM

– Управление памятью

– Сборка мусора

– Потоки и синхронизация

– Обработка исключительных ситуаций

– …

• Кроме Java кода, есть сторонний код

– Native методы + нативные библиотеки (в т.ч. ОС)

Page 37: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java

А что сравниваем?

Динамические

компиляторы

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

А что сравниваем?

• Качество самой реализации влияет на

производительность приложения

– 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

Будущее Java

• У беспроводных устройств есть

БАТАРЕЙКА

• Процессорное время в облаках дорого

Page 40: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java

Будущее Java

• У JIT и AOT есть свои преимущества

• Совмещение двух подходов даст

максимальный эффект

Page 41: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java

Для тех, кто в танке

Page 42: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java

Для тех, кто в танке

• Есть много JVM с уникальными

свойствами

• Статическая компиляция Java возможна

и дает преимущества

• Будущее за гибридным подходом

Page 43: CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и статического компиляторов для Java

Вопросы?

Никита Липский,

Excelsior

[email protected]

(383) 330-55-08