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.methodresolved 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.
Источники
- OSR оптимизация в V8 · AsForJS · 2025-10-13
- Live Coding V8 Native Syntax · AsForJS · 2025-02-14
- Этапы интерпретации JS кода · AsForJS · 2023-10-27