Switch vs IF в V8
Распространённый миф: «switch с N кейсами быстрее цепочки if через jump table». В V8 это не так — switch сводится к if на уровне байт-кода. Иногда даже медленнее.
Что показал разбор
- Спикер взял
doSwitch(p)иdoIf(p)с эквивалентным телом. - Сгенерировал байт-код и машинный код через V8 Native Syntax.
- Switch и if приводятся к одинаковым условным переходам.
«Свитч является синтаксическим сахаром к иф. Существующий свитч... приводится к тому же, к чему приводится и иф — к последовательности условных переходов.»
Switch может быть МЕДЛЕННЕЕ
Каждый case: ... return — это отдельная точка выхода функции. TurboFan хуже инлайнит функции с множественными return.
«Код функций нужно стараться организовывать так, чтобы он содержал не более одного return. Тем самым мы помогаем оптимизирующему компилятору вставить код функции вместо вызова.»
// Плохо для инлайна
function fn(x) {
switch (x) {
case 1: return 'a';
case 2: return 'b';
case 3: return 'c';
}
}
// Лучше для инлайна
function fn(x) {
let r;
if (x === 1) r = 'a';
else if (x === 2) r = 'b';
else if (x === 3) r = 'c';
return r;
}
If — более низкоуровневая конструкция
«На уровне IF мы можем выстраивать более сложные конструкции, и V8 в некоторых случаях может более эффективно оптимизировать.»
Подводные камни
- Pointer compression влияет на машинный код — но смысл тот же.
- Не оптимизируй на switch/if без замеров — разница часто в шуме.
- Single-return стиль помогает инлайну универсально, не только для switch.
Источники
- Производительность JS Switch против IF · AsForJS · 2025-02-01
- Цитата: «Свитч является синтаксическим сахаром к иф.»
- Цитата: «Код функций нужно организовывать так, чтобы он содержал не более одного return.»