2012-03-30 3 views
11

thisウェブサイトには、forループのバリエーションがあります。 arr.lengthがすべてのステップで計算されていないため、わずかなパフォーマンス向上が見られるため、for(var i=0, len=arr.length; i<len ;i++)ループ(arrは配列)の使用法を理解できます。しかし、他のバリアントを使用する利点は何ですか?例えば、ループのバリエーション

  1. for (var i=arr.length; i--;)
  2. for (var i=0, each; each = arr[i]; i++)

のようなループループの変動を異なる使用して性能の顕著な変化はありますか?非常に大きな配列の場合でも私は一般的にfor(var i=0, len=arr.length; i<len ;i++)を使用します。だから私はここに欠けているものがあるかどうかを知りたい。

+0

"decrementing"ループは、jsではるかに高速です。最後のものはjs偽== 0 == ""のため、私はそれを使用しませんでした。 – mpm

+0

[JavaScript - ループは本当に逆に高速ですか?](http://stackoverflow.com/questions/1340589/javascript-are-loally-really-faster-in-reverse) – Matt

+1

@camus 1つは、例えばループスルーするときに有用であり得る。 DOM要素のコレクション –

答えて

6

広くループ

var loop = arr.length; 
while(loop--) { 
} 

は(これもかなり長い間のECMAScriptに適用されるが、私はすべてのアップに考えるC-ような言語で利用可能な最速のループ型である一方、逆転していると考えられます今日の標準的なループでも日付エンジンはかなり優れています)。 (jsperf

あなたの「変動が」NOバリエーションが実際にありませんが、for-loopconditional文のちょうど異なる使用(、実際にそれvariation..dohになります!)。

1)と同様

for (var i=arr.length; i--;)ただ反復とiがtruthy値を持っているかどうかのチェック、両方を行うためにfor-loopから条件部分を使用しています。 i0になると、ループが終了します。

2)for (var i=0, each; each = arr[i]; i++)

ここでは、各反復から要素を取得するので、私たちは直接そのループ本体内にアクセスすることができます。これは、常にarr[ n ]を繰り返すことに疲れている場合によく使用されます。

ループする前に.lengthプロパティをキャッシュするのがうまくいきます。あなたが正しく言及したように、すべての反復でそのプロパティにアクセスする必要がないので、時間がかかります。それ以外にも、HTMLCollectionsのような 'ライブ構造'を扱うときに、DOMスクリプティングで必要となることがあります。

2

イテレータをデクリメントしているときに、実際には長さではなく0に比較されます。これは、 "<、< =、>、> ="演算子が両方の型チェックを必要とするためどのような比較動作を使用すべきかを決定するために、オペレータの左右の両側に配置される。

最速のループがある:あなたが順序を気にしない場合は、使用している方法は結構です、

var i = arr.length 
while(i--) 
{ 
} 

を(あなたはもちろんの順番を気にしない場合)。

1

これは、偽の値で失敗してループを壊すため、各ループにaをあまり使用しません。

for (var i=0, each; each = arr[i]; i++) 

また、このループは使用しません(タフでも高速です...)

for (var i=arr.length; i--;) 

これは混乱して読みにくくなりますが、逆ループのように書くこともできます。これは最も遅いもので

2

jsperfによるJavaScriptでのループの最速のタイプは、直前(私のデフォルトのループ)の

var arr = new Array(10); 
var i = 0; 
while (i < arr.length) { 
arr[i]; 
i++; 
}; 

ある

var arr = new Array(10); 
for (var i = 0; i < arr.length; ++i) { 
arr[i]; 
}; 

var arr = new Array(10); 
arr.forEach(function(x) { 
x; 
}); 

少なくともOSX 10.7.3のChrome 17で。だから、 "デフォルト"のループは結局いいですね!

+0

これらのjsperfテストは非常に便利です。ありがとうございました! –

関連する問題