この件に関するいくつかの質問/記事を読んだことがありますが、私のソリューションでテストしたところ、同じコード ブロックを使用する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が要求したように:各ループの「内部コード」は決して変更されておらず、それが理由であってはなりません。さらに、このオブジェクトに同じ方法でアクセスする場合(
For
orを使用Each
)list[i].SomeProperty
、時間差が内部のせいになることは決してありませんコード(と思います)。
アップデート #3
- 時々、さまざまな変数を使用してカスケード「ループ」を使用しています
i
,ii
,iii
. - 同じ関数内で変数を「再利用」することがよくあります。
var l = list1.length; ...; l = list2.length;
for
同じことが変数 i
、ii
、にも当てはまります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 の可用性を最小限に抑えようとしています。