ну как вам сказать. Учитывая что под жавовым AOT понимается байткод который интерпретируется, то его как ни оптимизирую обычный jit будет быстрей. Реальный AOT (есть проекты) реально делают куча оптимизаций, но и времяф билда увеличивается
Так. Хотя я с Вами не согласен в понимании слова AOT, но имею что сказать о качестве оптимизации. Если сравнивать AOT и JIT, то ключевые отличия состоят вот в чём:
1. У JIT жёсткое ограничение по времени компиляции. Из-за этого часть оптимизаций неприменима (гуглите например struct-reorg gcc, в межпроцедурной версии она долгая).
2. В режиме по умолчанию JIT имеет информацию о профиле и целевой архитектуре. Но AOT её тоже может иметь, если программист заморочится, соберёт профиль и даст опцию о целевой архитектуре.
Таким образом, если искать в принципе максимальной производительности, то имхо нужно использовать AOT с перечисленными мной наворотами, а если хочется приличной производительности при минимуме усилий, то лучше JIT.