Почему компилятор Graals AOT работает медленнее, чем JIT?
В общем, когда разработчики пытаются объяснить, почему (сильно настроенный) C++ примерно в 2 раза быстрее, чем Java, они отмечают, что одним из факторов является то, что компиляция C++ AOT имеет гораздо больше времени для проведения обширных оптимизаций, чем JIT. Поэтому я предположил, что компиляция AOT в Graal будет иметь аналогичные возможности, так что даже если она не такая быстрая, как C++, она будет, по крайней мере, быстрее, чем компиляция JIT - однако, похоже, это не так. Это почему? В частности, существуют ли конкретные сценарии, в которых AOT-компилятор Graal будет работать быстрее? И наоборот, есть ли случаи, когда JIT будет быстрее, чем GRAAL AOTr? (Таким образом, я могу принять обоснованное решение о том, насколько это может быть полезно, когда я полностью построю свое решение)?
1 ответ
Одним из факторов является то, что компиляция C++ AOT имеет гораздо больше времени для проведения обширных оптимизаций, чем JIT.
Это на самом деле не проблема. JIT может занимать столько времени, сколько нужно для оптимизации, а также выполнять несколько инкрементных компиляций. Это можно сделать в фоновом потоке.
На самом деле это сводится к: информации. Хорошо настроенный C++ работает быстро, потому что разработчик, написавший его, использовал всю доступную информацию для оптимизации кода. Это означает возможность делать больше предположений или делать хитрые приемы оптимизации, а язык C++ позволяет настраивать все ручки оптимизации.
JIT, конечно, делает это лучше, но он не обязательно содержит всю информацию о конкретном фрагменте кода, который мог бы иметь разработчик, потому что это более общий оптимизатор. В некоторых случаях JIT также имеет встроенные функции компилятора, которые в основном являются ручными настройками для определенных методов и шаблонов кода. Опять же, это разработчик, который использует превосходные знания об определенной ситуации для оптимизации.
Однако с простой Java AOT все наоборот; Поскольку компилятор AOT запускается раньше выполнения программы, у него меньше информации о среде, в которой запускается программа, и нет информации о профилировании, и поэтому он может выполнять менее эффективную оптимизацию.