2017-01-27 14 views
0

私の質問は比較的簡単です。しかし、私はその答えが複雑で興味深いと思う。私はJavascriptでループを繰り返す2つのスニペットを持っています。この反復方法はなぜ高速ですか?

スニペットA:

//Fast 
var l = arr.length; 
for (var x = 0; x < l; x++) { 
    dosmth = arr[x]; 
} 

スニペットB:それはなぜ

//Very Fast 
var l = arr.length; 
var x = 0; 
while (x>l) { 
    dosmth = arr[x]; 
    x++; 
} 

スニペットBは、スニペットAよりもかなり速いのですか?スニペットAにはスコープやコンテキストの変更が増えていると思われますが、ドキュメントは見つかりません。

+15

あなたの論理的なチェックはあなたがテストしたのはどのブラウザのx < l vs x >リットル – Submersed

+1

反転しているように思えますか? *すべての*ブラウザで2番目の例が高速ですか?また、どのようにアプローチの実行時間を見いだしていますか? –

+0

どのJavaScriptエンジンを使用していますか? – uncoder

答えて

3

私のコメントを拡大するために、後者は、チェックが反転されているので、おそらく反復を打つことはありません。まず、x <と第2のx> lをチェックしています。

1

変数が1つで暗黙的にチェックされていますが、逆方向に実行されます。

var i = array.length; 
while (i--) { 
    dosmth = arr[x]; 
} 
+1

配列を後方に反復すると、エンジンによっては基礎となるデータ構造がハッシュに切り替わります。悪化するだろう。だから私はこの種のマイクロ最適化を勧めます。 – Oriol

+1

適切なプロファイリングとテストなしで最適化しないでください。まず、あなたはarr [x]を意味すると思います。第二に、今日のハードウェアではこれがもっと速くなる(おそらくさらに遅くなる)とは信じられません。 – Axel

+0

しかし、なぜエンジンが後方反復を上方反復よりも遅くするべきか?最後から反復する必要があります。 –

関連する問題