@htmldeveloper

Почему перебор массива через for быстрее, чем .map()?

Выполнил такой код в консоле хрома:

console.time('simple');
var b = new Array(1000000);
for (var i = 0; i < 1000000; i++) {
  b[i] = i * 2;
};
console.timeEnd('simple');

console.time('es6');
var b = new Array(1000000);
b.map((_, i) => i * 2);
console.timeEnd('es6');

// simple: 60.467041015625ms
// es6: 239.360107421875ms


Почему for быстрее map? И корректны ли такие замеры
  • Вопрос задан
  • 558 просмотров
Решения вопроса 2
lazalu68
@lazalu68
Salmon
Во-первых, у вас тест с map неправильный, гляньте в консоль.

Во-вторых, for это цикл, в котором 1) сначала выполняется initialization, 2) потом перед каждой итерацией проверяется condition, 3) выполняется тело цикла, 4) а после итерации выполняется final-expression, вот и всё. А map включает в себя еще некоторую логику, как минимум сборку нового массива, и неизвестно что еще; map это сложная функция.

Бтв, вот версия теста чуть корректней: разделены процедуры создания массива и итерирования по нему.
var b = new Array(1000000);
for (var i = 0; i < 1000000; i++) {
  b[i] = i;
};

console.time('simple');
for (var i = 0; i < 1000000; i++) {
  b[i] *= 2;
};
console.timeEnd('simple');


var b = new Array(1000000);
for (var i = 0; i < 1000000; i++) {
  b[i] = i;
};

console.time('es6');
b.map((_, i) => i * 2);
console.timeEnd('es6');

// simple: 5.100830078125ms
// es6: 161.93994140625ms

Ответ написан
Комментировать
RubaXa
@RubaXa
Хосподи, ну тут вам и написали ахинеи, слов нет.

Начнём с того, что результат вот этого
var b = new Array(1000000);
b.map((_, i) => i * 2); // [empty × 1000000]

Будет пустой массив из 1КК «дырок», а не `[0, 2, 4, ..., 1999998]`

Во-вторых, посмотрите, что делает array.map и сравните с вашим `for`.

В-третьих, v8, такой v8, что до сих пор не могут выкинуть js-реализацию этих методов и запилить нормульную native-имплементацию.

В-четвертых, создание стрелочной функции не бесплатно.

В-пятых, мекробенчмарки (без контекста) — зло.

P.S. Вот FF молодец: https://jsbench.github.io/#d498a7c676aa46e17eb9a8e...
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Krasnodar_etc
@Krasnodar_etc
avito front
Почему он должен быть быстрее?) У них разные цели и функционал.
А for (var i = 1000000 - 1; i >= 0; i--)
Будет ещё быстрее, чем с ++

Здесь можно делать довольно объективные замеры
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
28 мар. 2024, в 21:17
5000 руб./за проект
28 мар. 2024, в 20:46
150000 руб./за проект
28 мар. 2024, в 20:37
50000 руб./за проект