Производительность идентификаторов в 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) убивает оптимизацию полностью.

Источники

См. также