Hot функции и оптимизация

«Горячей» V8 называет функцию, переступившую внутренний счётчик вызовов или итераций. Только горячие функции попадают в TurboFan. Для холодных — Ignition навсегда.

Что делает функцию горячей

  • Счётчик вызовов превышен (~10⁴ в современных V8).
  • Внутренний цикл прошёл много итераций → срабатывает OSR.
  • Type feedback стабилен (нет резких смен формы аргументов).

Что мешает стать горячей

  • Функция вызывается с разными формами — IC уходит в polymorphic/megamorphic.
  • Аргументы случайно — null, undefined, разные типы.
  • try/catch, with, eval внутри.
  • Слишком большое тело — TurboFan может отказаться компилировать.

Inlining

TurboFan может встроить тело горячей функции в caller.

Условия:

  • Размер callee < лимита.
  • Caller тоже горячий.
  • Тип callee стабилен (один и тот же objet receiver).
  • prototype.method resolved on stable hidden class.

Single-return стиль помогает inliner.

Как посмотреть оптимизацию

node --trace-opt --trace-deopt script.js

Ищи строки:

  • [optimized: ...] — TurboFan скомпилировал.
  • [deoptimizing: ...] — откат в Ignition.
  • [disabled optimization: ...] — V8 решил не оптимизировать.

V8 GetOptimizationStatus

// d8 --allow-natives-syntax
function fn(x) { return x + 1; }
fn(1);
%OptimizeFunctionOnNextCall(fn);
fn(2);
console.log(%GetOptimizationStatus(fn));   // битовая маска

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

  • В разных версиях V8 пороги «горячести» разные.
  • --always-opt форсирует оптимизацию — для отладки.
  • Прогрев в бенчмарках критичен: первые ~10⁴ вызовов — Ignition, дальше — TurboFan.

Источники

См. также