ローカル変数とループ
ループのパフォーマンスを向上させるもう1つの簡単な方法は、全長に向かってインクリメントするのではなく、イテレータを0に向かってデクリメントすることです。この単純な変更を行う
と、各反復の複雑さに応じて、元の実行時間を最大50%節約できます。
取得元:http ://oreilly.com/server-administration/excerpts/even-faster-websites/writing-efficient-javascript.html
- ループが毎回計算する必要がないように、をローカル変数
nodes.length
として保存してみてください。
- また、
nodes.get(i)
ローカル変数に格納して、そのデータに頻繁にアクセスする場合に時間を節約することもできます。
- 順序が重要でない場合は、forループを0に向かってデクリメントすることを検討してください。
- jQueryの
each()
ループは、自分でセットをループするよりも少し遅くなります。ここで、明らかな違いがあることがわかります。
非常に簡単な例
私の例では、ループをループに凝縮していることがわかりwhile
ます。
var nodes = $(".rr span");
var i = nodes.length;
while(i--){
if(i%2 === 0){
nodes.get(i).style.color = "blue";}
}
while
ループはi
反復ごとに減少することに注意してください。このようにすると、はに評価されるi = 0
ため、ループは終了します。while(0)
false
アレイの「チャンキング」
チャンク()関数は、配列を小さなチャンク(したがって名前)で処理するように設計されており、3つの引数を受け入れます。項目
の「実行」リスト、
各項目を処理する関数、および値を設定するためのオプションのコンテキスト
変数です。 process()関数内でこれを実行します。各アイテムの処理を遅らせるためにタイマーが使用されます(この場合は100ミリ秒ですが、特定の用途に合わせて自由に変更してください)。通過するたびに、配列の最初の項目が削除され、process()関数に渡されます。処理するアイテムがまだ残っている場合は、別のタイマーを使用してプロセスを繰り返します。
ブラウザがクラッシュする可能性を減らすためにセクションでループを実行する必要がある場合は、ここで定義されているNickZakasのメソッドを参照してください。chunk
function chunk(array, process, context){
setTimeout(function(){
var item = array.shift();
process.call(context, item);
if (array.length > 0){
setTimeout(arguments.callee, 100);
}
}, 100);
}
createDocumentFragment()の使用
ドキュメントフラグメントはメモリ内にあり、メインのDOMツリーの一部ではないため、子を追加してもページのリフロー(要素の位置とジオメトリの計算)は発生しません。その結果、ドキュメントフラグメントを使用すると、多くの場合、パフォーマンスが向上します。
DocumentFragmentは、Internet Explorer 6を含むすべてのブラウザーでサポートされているため、使用しない理由はありません。
リフローは、レイアウトエンジンのフォーマットオブジェクトのジオメトリが計算されるプロセスです。
これらの要素の表示プロパティを繰り返し変更しているため、ページは変更のたびにウィンドウを「再描画」します。そこですべての変更を使用createDocumentFragment
して行い、それらをDOMにプッシュすると、必要な量が大幅に削減されますrepainting
。