Действительно ли reduce, filter, map и прочие работают медленнее обычного for?

Добрый день. Решил поглубже погрузиться в изучение операций с массивами, пробуя решать одни и те же задачи разными способами и измеряя производительность старым добрым performance.now(). И с удивлением обнаружил, что в подавляющем большинстве задач вышеупомянутые reduce, filter, map, find отрабатывают медленнее (иногда даже в десятки раз), чем более многословный и многоэтажный цикл for. Задачи самые разные - сортировка, математические операции с элементами массива, фильтрация по самым разным критериям и проч. И почти всегда for работает быстрее. Также, что интересно - иногда в небольших массивах for работает медленнее. Но если массив большой, скажем, от 1000 элементов - то for вырывается вперед. Это действительно так, или все-таки есть некий ограниченный круг задач, где означенные методы выигрывают в производительности? Тогда хотелось бы знать, какого рода могут быть эти задачи.
  • Вопрос задан
  • 1682 просмотра
Пригласить эксперта
Ответы на вопрос 6
Xuxicheta
@Xuxicheta
инженер
Сегодня быстрее, завтра не быстрее, послезавтра быстрее.
Перфоманс таких вещей зависит от реализации js и будет разным на разных движках и версиях.
Без веских причин не стоит экономить на спичках жертвуя читабельностью.
Будь методы перебора массивов не нужны, их не сделали бы, правда ведь?
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Всё из-за постоянных проверок типов данных.
Хотите быстро - нативный js
Хотите очень быстро - c++ либы через emscripten.
Ну, и не кривые алгоритмы, разумеется.
Ответ написан
iCoderXXI
@iCoderXXI
React.JS/FrontEnd engineer
Методы массивов на вход получаются коллбек, потом его вызывают, получают обратно значения.

Многие из коллбеков создают и заполняют новый массив. Это всё накладные расходы.
Ответ написан
Комментировать
@grinat
Ну а чо тут удивительного? Как бэ это очевидно. Ну на маленьких массивах это не заметно и смысла нет запариваться, если массив большой, то разница всегда очень приличная. Да и сортировка встроенная в js не всегда самая быстрая и т.д. В любом случае львиная доля js разрабов с такими задачами врядли столкнется. Да и зачем в этом разбираться, алгоритмы жеж для лохов.
Ответ написан
Taraflex
@Taraflex
Ищу работу. Контакты в профиле.
Можно заинлайнить
https://github.com/vzhou842/faster.js
Ответ написан
Комментировать
dom1n1k
@dom1n1k
Да, действительно все эти методы работают медленнее обычного for.
Безусловно медленнее и так будет всегда. Никакой прогресс JS-компиляторов не изменит этой ситуации. Оптимизации компиляторов могут только уменьшать отставание данных методов от простого цикла, но никогда не сделает их равными и уж тем более быстрее. Преимущество этих методов не в скорости, а исключительно в читаемости кода и то при условии разумного применения.
Но всегда нужно смотреть по ситуации. Может у вас массив из 10 элементов и ваша потенциальная экономия это 1 микросекунда? В большинстве случаев (хотя и не всегда) проигрыш производительности будет пренебрежимо мал.
Но если вы обоснованно считаете, что перфоманс вам критически важен - конечно, используйте for.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы