Ignition vs TurboFan

Два пласта рантайма V8: Ignition — интерпретатор байт-кода (JIT первого уровня), TurboFan — оптимизирующий компилятор. Понимать их обязательно — без этого нельзя писать перформантный JS.

Что это / Механика

  • Ignition — стековая виртуальная машина. Берёт JS-код, превращает в байт-код, интерпретирует команду за командой.
  • TurboFan — оптимизирующий компилятор. Превращает байт-код в машинный код для горячих функций.
  • Ignition по ходу выполнения собирает статистику (type feedback) и решает, какие функции «горячие».
  • Когда функция признана горячей — Ignition отдаёт команду TurboFan: «компилируй».
  • Раньше был Crankshaft (полная компиляция всего кода сразу) — заменён парой Ignition+TurboFan ради ленивости.

Жизненный цикл функции

JS-source → Parser → AST → Ignition (байт-код)
                              ↓ интерпретация
                              ↓ сбор type feedback
                              ↓ функция стала "hot"
                          TurboFan (машинный код)
                              ↓ feedback не подтвердился
                          deopt → откат в Ignition

Подводные камни

  • TurboFan может деоптимизировать функцию обратно в байт-код, если предположения о типах не сбылись.
  • «Деоптимизировать» функцию проще, чем оптимизировать заново — пиши стабильный по типам код.
  • Слишком много форм объектов / типов аргументов → функция остаётся в Ignition и не получит ускорения.
  • Понимание Ignition важнее, чем кажется: 80% кода в современных приложениях исполняется именно в нём.

Источники

См. также