Оптимизация JavaScript для цикла - PullRequest
0 голосов
/ 06 октября 2011

Итак, у меня есть известное на некоторое время, что

for ( var i=0, len = myArray.length; i < len; i++ ){

}

более эффективно, чем

for ( var i=0; myArray.length; i++ ){

}

для больших массивов.Но интересно, сколько выигрыша в производительности дает первое?

Сегодня я решил сделать несколько тестов.Я создал массив и поместил в него 100 000 чисел.

    var array = []; 
    for( var i = 0; i < 100000; i++ ) 
         array.push(i);  

Затем я протестировал оба цикла выше, выполнив console.log для каждого из чисел в массиве и рассчитав время выполнения процесса.

console.time('loop'); 

for( var i = 0; i < array.length; i++ )
     console.log(i); 

console.timeEnd('loop');  

И для второго теста

console.time('loop'); 

 for( var i = 0, len = array.length; i < len ;i++ )
     console.log(i) 

console.timeEnd('loop') 

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

Ответы [ 3 ]

1 голос
/ 06 октября 2011

Вот соответствующий jsperf: http://jsperf.com/caching-array-length/4, который показывает, что разница может быть удивительно мала.

0 голосов
/ 07 октября 2011

Теоретически между вашими примерами не должно быть никакой разницы в скорости.

Идея, что первый пример будет работать быстрее, пришла от таких языков, как php, где эквивалентом будет "$ i

Результатом является то, что в случае JavaScripts единственное различие между чтением «arrlen» и «somearray.length» заключается в том, куда указывает указатель, поэтому скорость будет в значительной степени идентична.

Тем не менее, судя по оценкам, опубликованным Джозефом, то, как это обрабатывается под капотом, очевидно, не столь прямолинейно. В случае с Chrome 15 inline на самом деле кажется быстрее, а в старших немного медленнее? o.0

0 голосов
/ 06 октября 2011

В этом случае это не имеет никакого значения. Доступ к свойству length массива является очень быстрой операцией, так как он обновляется каждый раз, когда массив изменяется, и, таким образом, вы просто получаете число.

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

...