6

この件に関するいくつかの質問/記事を読んだことがありますが、私のソリューションでテストしたところ、同じコード ブロックを使用するforと、ほとんどの場合each.

ただし、私の質問は、約 30 の「ループ」を使用した私のページでは、使用した開始結果eachが約 5300ms (平均) で、最大値が 5900ms、最小値が 4800ms であったという事実に関連しています。

そして、それらを変更した後for、最終結果は驚くほど遅くなり、以前の平均よりも時間がかかります (そして、4800ms よりも低くなることはなく、6000ms よりも高くなることはありませんでした).....しかしconsole.time('Time') console.timeEnd('Time')、各シングルに配置すると、"ループ ブロック" 期待どおりの結果が得られます (FOR の方が高速です)。

グローバルな「時間」がforよりも遅い使用である可能性はありeachますか?

考えられる理由をいくつか教えてください。

PS-完全なソース コードは巨大であり、ここで重要な部分は、唯一の変更点である:eachに変換されたループforです。

For ループに使用されるサンプル

var l = list.length;  
for (var i=0;i<l; i++) {  

}

Each ループに使用されるサンプル

$.each(list, function (i, item) {

});

更新 #1

  • 時間は を使用して測定されconsole.time('Time') console.timeEnd('Time')ます。グローバル時間については、1 つの「カウンター」のみを使用します。複数のカウンターの場合、もちろん異なる名前を使用します。
  • このすべての「プロセス」の間、Ajax リクエストは存在しないため、時間の違いはこれに関連していません。

アップデート #2

  • @epascarelloが要求したように:各ループの「内部コード」は決して変更されておらず、それが理由であってはなりません。さらに、このオブジェクトに同じ方法でアクセスする場合(Fororを使用Eachlist[i].SomeProperty、時間差が内部のせいになることは決してありませんコード(と思います)。

アップデート #3

  • 時々、さまざまな変数を使用してカスケード「ループ」を使用していますi, ii, iii.
  • 同じ関数内で変数を「再利用」することがよくあります。

var l = list1.length; ...; l = list2.length;

for同じことが変数 iii、にも当てはまりますiii

アップデート #4

Chrome で奇妙な動作に気付きました。次のパターンが数回繰り返され、しばらくダウンしてから再び急上昇します。

  • DrawGUI: 6159.000ms UP再び
  • DrawGUI: 5990.000msダウン
  • DrawGUI: 5804.000msダウン
  • DrawGUI: 5416.000msダウン
  • DrawGUI: 5315.000msダウン
  • DrawGUI: 5311.000msダウン
  • DrawGUI: 5325.000ms
  • DrawGUI: 5248.000msダウン
  • DrawGUI: 5010.000msダウン
  • DrawGUI: 4886.000msダウン
  • DrawGUI: 5645.000ms *再びUP *
  • DrawGUI: 5247.000ms
  • DrawGUI: 5446.000ms

このすべての睾丸の間、私は他のすべてのクロムタブと不要なアプリケーションを閉じます. 不安定な CPU の可用性を最小限に抑えようとしています。

4

1 に答える 1

1

空のループのベンチマークを行っているため、JIT (ジャスト イン タイム コンパイラ) に最適化のための十分な余地を与えます。each副作用がないため、呼び出しがまとめて削除される場合があります。ただし、for ループは、for ループ内ではなく、for ループを含むiスコープで定義されているため、実行する必要があります。

(function() {
    for (var i=0; i<10; i++) {}
    console.log(i); // outputs 10
})();

(function() {
    [0,1,2,3,4,5,6,7,8,9].forEach(function(i) {});
    console.log(i); // i is not declared
})();

iこれが、次のコードでJSLint/JSHint が 2 回宣言されていると文句を言う理由でもあります。

for (var i=0; i<10; i++) {}
for (var i=0; i<10; i++) {}
于 2013-01-29T13:52:50.457 に答える