1

ループ構造が私の目に留まったとき、私はいくつかのJavaScriptコードを調べていました。それは特に特別なことではなく、私がしていることとは異なる方法で繰り返されました。順序に依存しないものをループする必要がある場合、通常はカウントアップし、次のように最初から最後まで繰り返します。

do
{
    // I feel like I'm going in circles
    i++;
} while (i < length)

ただし、このJavaScript関数はカウントダウンし、最後から最初までループします。

var i = data.length - 1;
if(i >= 0)
{                   
    do
    {
        // Around and around, we go                     
    }while(i--)
}

カウントダウンすることに利点はありますか、それとも開発者の好み次第ですか?

4

5 に答える 5

4

私はあなたが配列から物事を削除しているので、後方に行く方が良いです。

10個の配列があり、ループ中に実行される条件を介して、インデックス3と4の項目を削除したいとします。カウンターを増やしています。3で削除すると、カウンターに対してアレイはどうなりますか?配列の長さが9に縮小され、インデックス4にあったものがインデックス3になり、カウンターが4にインクリメントされます。削除したいものをスキップしただけです。逆方向に進むと、この問題を回避できます。

また、プロセッサはインデックスを乱数と比較するよりも速く0と比較できるため、逆方向に進む方が高速です。

于 2012-07-31T15:22:12.657 に答える
0

おそらくそうではありません。ほとんどの場合、開発者は逆算したかっただけです。

ただし、標準の0から長さ1のループが常に理想的であるとは限りません。たとえば、特定のキャッシングアーキテクチャでは、何らかの理由で、構造の要素に逆にアクセスする方が高速な場合があります。これがJavaScriptで発生する合理的なケースは考えられませんが、アプリケーションベースの言語、特にCのような比較的低レベルの言語では発生します。

于 2012-07-31T15:20:47.240 に答える
0

同様のSOの質問/回答を引用するには:

forwards-conditionは毎回配列の長さプロパティを受け取る必要があるのに対し、他の条件は「ゼロより大きい」かどうかをチェックするだけでよいため、非常に高速なタスクです。

ループ反復-Bergi

于 2012-07-31T15:25:34.490 に答える
0

うーん。理論的には、forを使用するループとwhileを使用するループの間に違いはないはずですが、ここに私の2セントがあります。違いがあるかどうかを確認する唯一の方法は、パフォーマンステストを実行することです。1つはwhileを使用し、もう1つはforを使用します。たとえば、100万個の要素について、実行時間を計算し、自分で確認します。ループする最適化手法は多数ありますが(forまたはwhile)、最も一般的なものの1つは、1つのループで複数の反復を実行することです。例:forループの標準は次のとおりです。

var i;
for (i=0;i < N; i++) {
    bla();
}

ここで、各反復で同じ複数回実行することにより、これを最適化します

var i;
    for (i=0;i < N; i+=5) {
        if (i < N-5) {
          bla();
          bla();
          bla();
          bla();
          bla();
        }
    }
for (j=i; j <N;j++){
  bla();
}

このようにして、反復回数が少なくなることが保証されます。各反復の実行内容、およびアレイ/スタックのサイズによっては、パフォーマンスが向上する可能性があります。ループのパフォーマンスを改善する方法についてはたくさんの記事があります

于 2012-07-31T15:27:18.427 に答える
0

JavaScriptでループを実行する最も速い方法がwhileループの減少を示す少なくとも1つの調査を見ました:https ://blogs.oracle.com/greimer/entry/best_way_to_code_a

これは調査のJavaScriptエンジンに固有であり、他の言語/マシンの実装では異なる結果が得られる可能性があることに注意してください。たとえばCの場合、最適化コンパイラはループを完全に展開し、生成されたコードはまったくループしません。

于 2012-07-31T15:34:23.333 に答える