Inline Cache и hidden classes
Hidden class (он же Map / Shape) — внутренняя «форма» объекта в V8. Inline cache (IC) — кэш типа результата внутри функции, помнящий, какие формы объектов сюда заходили. Основа всех оптимизаций объектов.
Hidden Class
V8 хранит «форму» объекта отдельно от данных. Два объекта с одинаковым набором свойств в том же порядке имеют один hidden class.
const a = {};
a.x = 1; // hidden class C1: { x }
a.y = 2; // transition C1 → C2: { x, y }
const b = {};
b.y = 2; // hidden class C3: { y } ← НЕ совпадает с C2
b.x = 1; // C3 → C4: { y, x }
«Как только мы туда добавляем еще одно поле, у нас Instance Point переходит из одного скрытого класса в другой. То есть он может путешествовать во время исполнения одного конструктора.»
Inline Cache
Inline-кэш живёт внутри функции и помнит формы объектов, которые туда заходили. У каждой функции свои локальные IC.
- Monomorphic — 1 форма → самый быстрый путь, прямой доступ по оффсету.
- Polymorphic — 2-4 формы → проверка по списку.
- Megamorphic — 5+ форм → общая глобальная hashmap, медленный поиск.
«Знания о форме накапливаются именно внутри этой функции. Если мы будем эти объекты передавать в какую-то другую функцию, в ней будут другие локальные inline кэши.»
Состояния IC
uninitialized → monomorphic → polymorphic (2-4) → megamorphic (5+)
↑ глобальный кэш для всего рантайма
Пример
function getX(o) { return o.x; } // IC
getX({ x: 1 }); // mono, форма {x}
getX({ x: 1, y: 2 }); // poly, +форма {x,y}
getX({ a: 0, x: 1 }); // poly, +форма {a,x}
// ещё 2 разных формы → megamorphic
Подводные камни
- Меняешь порядок присваиваний свойств → разные hidden classes для «одинаковых» объектов.
delete obj.field→ объект уезжает в dictionary mode (медленный hashmap).- Не добавляй свойства после конструктора — инициализируй всё в
constructor/литерале сразу. - IC привязан к месту в коде функции — не пиши «универсальные» функции, принимающие разные формы.
Источники
- Мономорфный и полиморфный код, инлайн-кэш, скрытые классы · 2019-10-29
- Цитата: «Это уже приводит к тому, что обращение к свойству x вот в этом месте становится полиморфным.»
- Цитата: «5-я форма = megamorphic... оптимизирующий компилятор, кроме вот этой локальной таблицы, имеет еще глобальную таблицу.»
- Производительность JS Объекты в V8 · AsForJS · 2025-02-07
- Производительность V8 объектов в примерах · AsForJS · 2025-02-11