ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript ループ ステートメントのパフォーマンスの問題

JavaScript ループ ステートメントのパフォーマンスの問題

黄舟
黄舟オリジナル
2017-02-28 14:18:421433ブラウズ

ほとんどのプログラミング言語では、ループステートメントがほとんどの時間を消費します
そして、ループ ステートメントは非常に重要なプログラミング パターンです。JavaScript には 4 種類のループがあります: -in ループ

最初の 3 つのループは他の言語でも非常に一般的です

for-in ループは学生にとっては初めてかもしれません。学校で C/C++ を学んだ人

各反復のプロパティでインスタンスとプロトタイプを同時に検索するため、反復ごとにより多くのオーバーヘッドが生成されます
    for-in ループの速度は、最終的には他のループの 1/7 だけになります3 つのタイプ
  1. したがって、明らかに不明な数のプロパティを持つオブジェクトを反復する必要がない限り、それを避けるように努めるべきです for-in を使用します

    配列を走査するために for-in ループを使用しないでください
  2. このようにオブジェクトをクリアします

    var props = [&#39;prop1&#39;, &#39;prop2&#39;],      i = 0;while(i < props.length){
        fn(obj[props[i++]]);
    }
  3. このコードは、オブジェクト内の属性に基づいてオブジェクト属性の配列を作成し、次に while を使用して属性リストをループし、対応する属性値を処理します
  4. この方法では、すべての属性を検索する必要はありませんオブジェクトの属性を取得し、ループのコストを削減します

    上記のメソッドの前提は、オブジェクト内部の属性が既知であることです
  5. オブジェクトの内部属性がわからない場合、実装
  6. も処理する必要がありますこれはオブジェクト自体のプロパティのみを実行できます

    for(var prop in obj){    if(obj.hasOwnProperty(prop)){
            //...
        }
    }

    コストは、各反復でプロパティが継承されたプロパティではなくオブジェクト自身のプロパティであるかどうかを判断する必要があることです。
for-in に加えて、他のループのパフォーマンスはほぼ同じです。同じなので、使用するときはニーズを考慮してループの種類を選択する必要があります



プログラミングを学んだばかりの友達は皆ループの書き方に慣れていると思います

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

このループステートメントが反復されるたびに、arrを検索する必要がありますlength 属性、これは非常に時間がかかります
それで、最適化できます
for(var i = 0, len = arr.length; i < len; i++){
    fn(arr[i]);
}
配列の長さの値をローカル変数にキャッシュすることで、問題は解決されます

while と do-while についても同じことが当てはまります

配列の長さに応じて, 多くのブラウザ 実行時間の約 25% を節約できます


配列の順序を逆にすることで、パフォーマンスをわずかに改善することもできます

for(var i = items.length; i--;){
    process(items[i]);
}
var j = items.length;while(j--){
    process(items[j]);
}
var k = items.length - 1;do {
    process(items[k]);
}while(k--);

このようにして、各反復制御条件は 2 つの時間 (数値が
Reduce 1 つの判断 (True かどうか) については、ループ速度がさらに向上します

最後にいくつかの言葉

誰もが次のような配列メソッドを使用したことがあるかもしれません。 arr.forEach() または jQuery の $() などのフレームワーク反復メソッド、 each() を使用して配列を反復処理します。

これらのメソッドは配列の各要素に対して関数を実行します

これらは便利ですが、通常よりもはるかに遅くなります。ループ (外部メソッドの呼び出し)
すべての場合において、ループに基づいています。反復は関数ベースの反復より約 8 倍高速です。

そのため、通常のループ (for、while、do-while) を使用できる場合は、これらの通常のループ (for、while、do-while) を使用するようにしています。ループ (for、while、do-while) を使用して問題を解決します

上記は JavaScript ループ ステートメントのパフォーマンスの問題の内容です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) を参照してください。 !



声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。