Страницы

Поиск по вопросам

понедельник, 24 февраля 2020 г.

Даёт ли “кэширование” длины массива прирост производительности в цикле for?

#javascript #google_chrome


Имею ввиду такую конструкцию:

var length = arr.length;
    for (var i = 0; i < length; i++) {
}


У меня получилась разница в разы: 



arr = [];
for (var i = 0; i < 100000000; i++) {
	arr[i] = i;
}

var b = Date.now();
for (var i = 0; i < arr.length; i++) {
}
console.log(Date.now() - b);

var b = Date.now();
var length = arr.length;
for (var i = 0; i < length; i++) {
}
console.log(Date.now() - b);




https://jsfiddle.net/q1tLcyap/
    


Ответы

Ответ 1



Если тело цикла не пустое - то любой возможный прирост производительности будет измеряться самое большее в единицах процентов. А если в теле цикла есть работа с DOM - то прироста от длины массива вы не заметите никак. Не экономьте на спичках. Пишите такой код, который проще читать.

Ответ 2



Забавные результаты Код теста: let arr = []; for (var e = 0; e < 1000; e++) arr.push(e); function run(count) { let f = [], s = []; count = parseInt(count) || 0; for (let e = 0; e < count; e++) { let start = Date.now(); for (let i = 0; i < arr.length; i++) null; f.push(Date.now() - start); } for (let e = 0; e < count; e++) { let start = Date.now(), length = arr.length; for (var i = 0; i < length; i++) null; s.push(Date.now() - start); } return { first: f, second: s }; } [1000, 10000, 100000, 1000000].forEach(item => { let tmp = run(item); console.info(`Размер массива: ${arr.length}\nКоличество итераций: ${item}\n\nБез кэширования (среднее): ${tmp.first.reduce((a, e) => a += e) / tmp.first.length}\nС кэшированием (среднее): ${tmp.second.reduce((a, e) => a += e) / tmp.second.length}`); }); Chrome 51: Firefox 47: Как видно, лису выгоднее кэшировать только небольшие структуры, чем больше массив, тем меньше пользы (даже в минус по пользе ушло). Хром так же, но кэширует эффективнее, видимо. Вывод: Оптимизация - сложная штука. Она вроде есть, а вроде и только минус :) В первую очередь - пишите человекопонятный код! Экономия человекочасов на разборе - А как оно работает? - перекроет -4 миллисекунды оптимизации. Потом уже можно думать как оптимизировать доступ к длине и прочее. Такие большие вещи нужно по небольшим кускам разделять.

Ответ 3



Раньше был тест где сравнивались все варианты перебора , назывался он foreach-vs-loop , сейчас он недоступен но можно поискать по картинкам, в кратце, разницы нет, с кэшированием даже получалось чуть-чуть медленнее, что удивительно обратный for был быстрее чем прямой ps: можно найти сохранённую копию, например на яндексе , это конечно не полный тест но интересующее в вопросе есть. ps: удивляет скорость assign in loop declaration , я бы даже сказал не удивляет в поражает.

Комментариев нет:

Отправить комментарий