2

数年前、forループの条件部分はループが実行されるたびに評価されると聞きました。また、そのプロパティへのアクセスは比較的高価です。

それ以来、私はforループを次のように書く習慣があります。

var data = [1,2,3,4,5,6];
for (var i=0, l=data.length; i<l; i++) {
    // do stuff
}

これは不要な最適化ですか?最新のJavascriptコンパイラ/インタプリタはすでに条件部分を最適化して、lengthプロパティが複数回アクセスされないようにしていますか?

とにかくこれはどのくらいの効果がありますか?

4

4 に答える 4

3

これは不要な最適化ですか?

はい、ほとんどの場合そうです。すべての JavaScript 実装にはO(1)、長さを取得するための複雑さがあると確信しています。私が想像できる唯一のケースは、ゲーム エンジンです。しかし、「通常の」JavaScript アプリケーションを作成する場合、それは問題にはなりません。最適化を行わなければ、コードははるかに読みやすくなります。

また、ループの本体とは対照的に、パフォーマンスが少し低下する可能性があることも確認する必要があります。ほとんどの場合、他の変数、繰り返し処理している要素のプロパティへのアクセス、または DOM の変更 (通常は地獄のように高価です) が含まれます。

ほとんどの場合、ループのパフォーマンスが大きな問題であった場合Array.prototype.forEach()、DOM 操作 (特に jQuery.each()が中古)それでも安いです。

于 2012-12-11T22:27:04.417 に答える
1

これをチェックしてください: https://blogs.oracle.com/greimer/entry/best_way_to_code_a

モジラでは:

for (var i=0; i<arr.length; i++) //4ms
for (var i=0, len=arr.length; i<len; i++) //3ms

これはライコーンの問題だと思います。

于 2012-12-11T22:31:10.917 に答える
1

ThiefMaster が言ったことに加えて、次のような配列を反復処理するのが一般的です。

var arr = [1, 2, 3];
arr.forEach(function(el, i) {
   //...
});

また

$.each(arr, function(i, el){
   //...
});

通常、反復ごとに関数全体を呼び出すことが許容される場合、配列の長さをチェックすることはほぼ確実です。

于 2012-12-11T22:29:26.873 に答える
0

この特定のケースは非常に一般的であるため、最適化されていると想定しても問題ありません。たとえば、Java では、その for ループは、境界チェックを最適化して取り除く唯一のケースとしてドキュメントに記載されています (Java で行うにはコストがかかります)。

別の見方をすることをお勧めします。考えられる最も一般的なケースが最適化されていない場合、特定のエンジンが最適化されていない他の多くのケースが存在する可能性が非常に高くなります。手動で最適化するのは少しばかげているようです。

于 2013-09-01T04:08:52.073 に答える