Почему компилятор Graals AOT работает медленнее, чем JIT? - PullRequest
0 голосов
/ 02 января 2019

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

1 Ответ

0 голосов
/ 23 февраля 2019

Одним из факторов является то, что компиляция C ++ AOT имеет гораздо больше времени для проведения обширных оптимизаций, чем JIT.

Это на самом деле не проблема. JIT может занимать столько времени, сколько нужно для оптимизации, а также выполнять несколько инкрементных компиляций. Это можно сделать в фоновом потоке.

То, к чему это действительно сводится, это информация. Хорошо настроенный C ++ работает быстро, потому что разработчик, написавший его, использовал всю доступную информацию для оптимизации кода. Это означает возможность делать больше предположений или делать хитрые приемы оптимизации, а язык C ++ позволяет настраивать все ручки оптимизации.

JIT, конечно, работает лучше, но он не обязательно содержит всю информацию о конкретном фрагменте кода, который мог бы иметь разработчик, потому что это более общий оптимизатор. В некоторых случаях JIT также имеет встроенные функции компилятора, которые в основном являются ручными настройками для определенных методов и шаблонов кода. Опять же, это разработчик, использующий превосходные знания об определенной ситуации для оптимизации.

Однако с простой Java AOT все наоборот; Поскольку компилятор AOT запускается раньше выполнения программы, он имеет меньше информации о среде, в которой выполняется программа, и информации о профилировании, и из-за этого он может выполнять менее эффективную оптимизацию.

...