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.»

См. также