Не мешай интерпретатору
Половина «оптимизаций» в проде на самом деле мешают Ignition и TurboFan. Не пытайся быть умнее JIT — пиши прямой, типизированный, моноформный код. V8 разберётся сам.
Что мешает интерпретатору и оптимизатору
try/catchвокруг горячего кода — в старых V8 гарантированный bailout (сейчас лучше, но всё ещё стоит).with,eval,Function— убивают всякую оптимизацию scope.arguments— лучше...rest, V8 спецификует rest проще.Function.prototype.apply(null, args)с переменной длиной — bailout.delete obj.x— объект уходит в dictionary mode.- Изменение
__proto__— слом hidden class. - Неконсистентные типы аргументов — функция остаётся в Ignition.
- Универсальные хелперы —
function isEmpty(x)для строки, массива, объекта, числа, null... мегаморф.
Универсальные функции — зло
// Плохо: мегаморф по форме input
function process(x) {
if (typeof x === 'string') return x.length;
if (Array.isArray(x)) return x.length;
if (typeof x === 'object') return Object.keys(x).length;
return 0;
}
// Хорошо: специализированные функции, monomorphic
function processString(s) { return s.length; }
function processArray(a) { return a.length; }
function processObject(o) { return Object.keys(o).length; }
Помогай JIT через стабильность
- Один тип для одной переменной (не присваивай
let xсначала число, потом строку). - Hidden class — один для одной роли объектов.
- Конструктор присваивает все свойства в одном порядке.
- Не «обогащай» объект свойствами по ходу.
Цитаты
«Внутрь V8 добавили специальную оптимизацию, которая старается убрать из окружения... любой идентификатор, который не используется внутри тела функции.»
V8 уже многое сам делает. Не дублируй его работу руками.
Источники
- Как не мешать интерпретатору сделать JavaScript код быстрым · AsForJS · 2025-11-09
- Optimizing JavaScript for fun and profit (review) · AsForJS · 2024-04-08
- Производительность и Clean Code · AsForJS · 2024-06-20