#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 , я бы даже сказал не удивляет в поражает.
Комментариев нет:
Отправить комментарий