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