V8 объекты: in-object / fast / dictionary mode

V8 хранит свойства объекта в три разных режима в зависимости от количества свойств и истории объекта. Cамый быстрый — in-object, самый медленный — dictionary.

Три режима хранения свойств

Режим Где живут свойства Скорость
In-object внутри самого объекта по фиксированным оффсетам максимум
Fast properties отдельный массив, оффсеты в hidden class быстро
Dictionary hashmap по имени медленно

Ordinary vs Exotic Object

По спецификации каждый объект имеет 13 внутренних методов (11 базовых + 2 для callable).

  • Ordinary object — все 13 методов стандартные.
  • Exotic object — хотя бы один переопределён (Array, Proxy, arguments).

V8 оптимизирует ordinary жёстче.

Когда объект уезжает в dictionary

  • delete obj.field → почти всегда.
  • Слишком много свойств (порядок десятков).
  • Динамическое добавление свойств с большими «номерами».
  • Использование объекта как hashmap для произвольных ключей.

Elements vs Properties

Числовые ключи (obj[0]) живут отдельно от строковых (obj.x) — это elements. У массивов elements — основной storage.

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

  • Не используй обычный {} как hashmap — возьми Map. Map спроектирован для произвольных ключей и не страдает.
  • Конструктор должен присваивать все свойства, иначе hidden class будет «доделываться» позже.
  • Объекты с одинаковыми свойствами в разном порядке = разные hidden classes.

Источники

См. также