Производительность идентификаторов в JS
Не «переменные», а идентификаторы. Имя и место объявления — два главных фактора их производительности в V8.
Что такое идентификатор
- Имя, связанное со значением в текущем lexical environment.
- «Переменная» — программистский жаргон, аналогия коробочки с именем.
- Внутри V8 — слот в массиве переменных контекста.
Два фактора скорости
1. Переиспользование строки имени
V8 интернирует строки имён в куче. Если в коде встречается одно и то же имя — это один объект в строковом пуле. Делает резолюцию быстрее.
2. Место объявления (scope chain depth)
// Быстрый доступ — локально
function fn() {
const x = 1;
return x; // 1 шаг в scope chain
}
// Медленнее — через замыкание
const x = 1;
function fn() {
return x; // подъём по scope chain
}
// Ещё медленнее — через with / eval / нелокальный
var, let, const с точки зрения V8
let/constимеют TDZ → лишняя проверка на каждом обращении до инициализации.- После прогрева TurboFan может elinimate TDZ check, если докажет.
- В горячем коде — разница в шуме.
Подводные камни
- Глобальные переменные — самые медленные (полный обход scope chain).
- Свободные переменные из замыкания удерживают весь scope от GC.
with(даже в legacy) убивает оптимизацию полностью.
Источники
- Performance of JavaScript variables identifiers (perf 03) · AsForJS · 2023-06-20
- Цитата: «Переменные — это такой программистский жаргон... коробочка с именем, в которую кладут значение.»
- Tips: Один символ и производительность · AsForJS · 2023-12-19