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 привязан к месту в коде функции — не пиши «универсальные» функции, принимающие разные формы.

Источники

См. также