10 мифов об оптимизации JS

Разбор популярного видео — что в нём правда, а что вредный совет. Главный посыл: большинство «правил» оптимизации придуманы из ниоткуда или устарели на 10 лет.

Мифы, которые умерли

  1. for всегда быстрее forEach — в современном V8 разница часто в шуме после прогрева. Без замеров не выбирай.
  2. ++i быстрее i++ — миф с конца 90-х, давно одинаково.
  3. switch быстрее if — нет, сводится к if.
  4. Кэшируй arr.length в for — V8 это сам делает с 2015 года.
  5. Используй битовые операции вместо Math — кроме узких кейсов, разница в шуме.
  6. delete оптимизирован — нет, переводит объект в dictionary mode.
  7. Object.create(null) всегда быстрее {} — на ключах-строках обычно медленнее (нет inline cache).
  8. JIT всё оптимизирует, можно писать как угодно — нет, нестабильные типы → деопт.
  9. async/await бесплатен — каждое await создаёт промис и микротаску.
  10. Map всегда быстрее Object — на small fixed-shape объектах {} быстрее.

Что реально работает

  • Сохранять monomorphic типы аргументов и форм объектов.
  • Не плодить мусор в горячем цикле (reuse arrays/objects).
  • Писать функции с одним return (помогает инлайну).
  • Меньше уровней косвенности (obj.a.b.c.d дороже, чем плоский access).
  • Избегать try/catch в горячих циклах (в старых V8 — гарантированный bailout).

Главный совет

«Если ты не замерил — не оптимизировал. Если измерил неправильно — тем более не оптимизировал.»

Сначала правильный бенчмарк, потом гипотеза, потом изменение.

Источники

См. также