Почему встроенные функции массива намного медленнее, чем цикл

Вопрос находится в заголовке, но вот более подробное объяснение.

Давным-давно я узнал некоторые приятные функции javascript, такие как сокращение, фильтрация, отображение и т.д.. Мне они очень нравились и стали часто их использовать (они выглядят стильно, и я думал, что, поскольку они являются родными, они должны быть быстрее, чем мои старые для циклов).

Недавно мне нужно было выполнить некоторые тяжелые вычисления js, поэтому я решил проверить, насколько они быстрее, и, к моему удивлению, они не быстрее, они намного медленнее (от 3 до 25 раз медленнее)

Также я не проверял каждую функцию, вот мои тесты jsperf для:

  • filter (в 25 раз медленнее)
  • reduce (в 3 раза медленнее)
  • map (в 3 раза медленнее)

Итак, почему родные функции намного медленнее, чем старые циклы, и зачем их создавать, если они не делают ничего лучше.

Я предполагаю, что потеря скорости вызвана вызовом функции внутри них, но все же это не оправдывает такую ​​потерю. Также я не понимаю, почему код, написанный с этими функциями, более читабельен, не говоря уже о том, что они не поддерживаются в каждом браузере.

Ответ 1

Я думаю, что в какой-то момент дело сводится к тому, что эти нативные функции больше сахара, чем оптимизация.

Это не то же самое, что использовать Array.prototype.splice вместо того, чтобы перебирать и делать это сами, где реализация, очевидно, будет иметь возможность делать гораздо больше под капотом (в памяти), чем вы сами могли бы.

В какой-то момент времени с фильтром, уменьшением и отображением браузера придется перебирать ваш массив и выполнять некоторую операцию над значением, содержащимся в нем (так же, как и с циклом). Он не может уменьшить сумму, которую он должен сделать для достижения тех же целей (он все еще выполняет цикл и выполняет операцию), но он может дать вам более приятный API и обеспечить проверку ошибок и т.д., Что увеличит время.