Как видно из предыдущих статей JIT-компилятор на 4-ом уровне способен создавать высокопроизводительный нативный код. В некоторых случаях, благодаря сбору статистки в реальном рабочем окружении, нативный код получается даже лучше, чем код созданный статическим компилятором из исходников C/C++. Именно поэтому Java-программисты заявляют, что Java-приложение по скорости может превзойти приложение, написанное на C/C++.
Как же нам достичь этого уровня компиляции, если для его достижения требуется 15.000 исполнений?
Прогрев (warm-up)
Мы можем исполнить нужный нам код намеренно заданное количество раз при старте системы, имитируя поведение системы и события реальных ситуаций. Этот подход называется warm-up (прогревание) кода и похож он на то, как гонщики перед стартом прогревают свои моторы, чтобы быстро выйти на пиковый режим сразу в начале старта. Или как спортсмены перед забегом разогревают мышцы и суставы.
Для прогрева системы вам требуется написать код, который будет вызван определенное количество раз при старте системы и вызовет все методы и классы, которые понадобятся позднее во время реальной работы.
Несколько советов:
- Соблюдайте предельную осторожность, чтобы на продакшене разогревающий код случайно не начал реально торговать
- При разогреве важно выполнить все ветки кода. Если вы разогреете только одну ветку кода, JIT-компилятор сгененрирует машинный код только для нее, игнорируя ветку кода, которая не выполнялась при разогреве. Позднее, когда наступит событие приводящее к исполнению неразогретой ветки кода вы получите задержку
- Разогреть код мало, надо его еще поддерживать в горячем состоянии. Если после разогрева в вашей системе ничего не происходит, например, система сидит и ждет какого-то события, JVM декомпилирует «остывший» код, а когда событие все же наступит, вы получите задержку. В идеале хорошо время от времени подогревать код, пропуская через него тестовые события, но это сопряжено с опасностью: тестовое событие может привести к реальной торговле
- Все замеры производительности делайте только на прогретом коде
Как пишется разогревающий код
- Пишете кусок кода, который вызывает самые критически важные для производительности куски кода.
- Запускаете ситему на тестовом стенде с параметрами -XX:+PrintCompilation -XX:+PrintInlining
- Смотрите логи, любуетесь тем, как прогревается код.
- Когда прогревка закончена, ставите метку в логах и начинаете на тестовом стенде симулировать реальные торговые ситуации.
- Если код разогрева написан хорошо, в логах после метки вы не увидите больше сообщений о компиляции. Если такие сообщения появляются, останавливаете систему, анализируете, что именно послужило причиной компиляции, и улучшаете код разогрева
- Снова запускаете систему и проверяете, исчезло ли сообщение о компиляции
- Продолжаете до тех пор, пока лог компиляции после разогрева будет идеально чистым.