Я думал, что компиляторы JIT в конечном итоге будут бить AOT-компиляторы с точки зрения производительности скомпилированного кода из-за присущего JIT (можно использовать информацию, доступную только во время выполнения). Один из аргументов заключается в том, что компиляторы AOT могут тратить больше времени на компиляцию кода, но серверная VM тоже может потратить много времени.
Я понимаю, что JIT, похоже, в некоторых случаях превзошел компиляторы AOT, но в большинстве случаев они по-прежнему отстают.
Итак, мой вопрос: каковы конкретные, жесткие проблемы, которые мешают компиляторам JIT бить компиляторы AOT?
EDIT:
Некоторые общие аргументы:
- Компиляторы AOT могут потратить больше времени на выполнение расширенных оптимизаций → Если вы используете VM на сервере в течение нескольких дней, вы можете потратить такое же количество времени, если не дольше.
- Интерпретация байт-кода имеет стоимость → . Большинство компиляторов JIT кэшируют собственные машинные инструкции в наши дни.
Еще одно редактирование:
Для конкретного примера см. Эту статью: Улучшение производительности Swing: JIT vs AOT Compilation. Из того, что я могу извлечь из этой статьи, авторы в основном говорят, что, когда нет горячих точек, преимущество в том, что информация о времени выполнения уменьшается и, таким образом, AOT без накладных расходов JIT, выигрывает. Но на 40%? Это, похоже, не имеет большого смысла. Это просто, что компилятор JIT, который был сравнен, не был настроен для этой ситуации? Или это нечто более фундаментальное?