0

だから私はそれをしばらく知っていた

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');  

そして2次試験へ

console.time('loop'); 

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

console.timeEnd('loop') 

これを数回テストした後、私の結果は決定的ではありません。両方のテストケースで、高い数値と低い数値の両方が得られます。だから私の質問は、事前に長さを取得するとパフォーマンスが向上することを明確に示すためのより良いテストは何ですか?

4

3 に答える 3

1

関連する jsperf: http://jsperf.com/caching-array-length/4 は、違いが驚くほど小さいことを示しています。

于 2011-10-06T19:07:40.467 に答える
0

この場合、違いはありません。length配列が変更されるたびに更新されるため、配列のプロパティへのアクセスは非常に迅速な操作であり、数値を取得するだけです。

ただし、通過したいくつかの要素をループしていた場合はdocument.querySelectorAll、結果をキャッシュすることをお勧めします。これは、への呼び出しquerySelectorAllが高価になる可能性があり、結果が変わりません。

于 2011-10-06T19:05:12.337 に答える
0

理論的には、実際には 2 つの例の速度に違いはありません。

最初の例がより速く実行されるという考えは、同等のものが "$i < sizeof($array)" になる php のような言語から来ています。ただし、PHP とは異なり、JavaScript は配列の長さを既に認識しているため、数値を直接読み取るだけです。

その結果、JavaScript の場合、「arrlen」と「somearray.length」の読み取りの唯一の違いは、ポインターが指している場所であるため、速度はほとんど同じになります。

とはいえ、Joseph が投稿したベンチマークを見ると、これが内部でどのように処理されているかは明らかに単純ではありません。Chrome 15 インラインの場合、実際には高速に見えますが、古いものでは少し遅いですか? o.0

于 2011-10-06T21:51:02.133 に答える