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.
Источники
- Производительность JS Объекты в V8 · AsForJS · 2025-02-07
- Цитата: «Ordinary object — внутри которой есть 13 внутренних методов, их может быть одиннадцать, два метода могут появляться или исчезать.»
- Цитата: «Любой объект, у которого из 13 методов логика хотя бы одного изменена, является экзотическим.»
- Производительность V8 объектов в примерах · AsForJS · 2025-02-11
- Что такое Object в JavaScript согласно спецификации · AsForJS · 2025-02-03