2016-05-05 7 views
-2

に近づきますまた行くことができます:長所と特定のループ(HTML要素)の短所は、それはこのようになります私は、JSは、HTMLの一部に生成してい

for (var i=1; i<=block_count; i++) { 
    var val = $("#block_"+i).text(); 
    ... 
} 

そこで質問です:より良いパフォーマンスが賢明だろうどっち重要な違いはありますか?
おそらく別のより良い方法がありますか?
最大ブロック数は約10'000ですが、理論的には無限大です。ゲーム中に成長します。

+1

'$("ブロック ")each(function(){...});'より読みやすくなりますが、実際にはどの方が良いでしょうか? ???パフォーマンス?その場合は、代わりにネイティブjsメソッドを使用してください。 –

+0

jsperfがダウンしていますが、jsperfのスクリーンショットといくつかの説明がある[sitepoint](http://www.sitepoint.com/speed-question-jquery-each-vs-loop/)からこれを見つけました。 – Brian

+1

これまで何をやろうとしているのかというと、必ずしもすべての要素を何度も繰り返す必要はありません。なぜあなたがこれを必要とするのか、より具体的なサンプルを提供すれば、要素の完全なリストに対して毎回ループするよりも良いことがあるでしょう。 –

答えて

0

通常、コードでは、不要なときにセレクタとjQueryコンストラクタを使用しないでください。要素のセットを構築し、あなたのコードのよりパフォーマンスバージョンが一度だけのようになります。

// Save the reference to the entire collection; you'll need to update 
 
// this as the list grows. You can use blocks.add() to add the newly 
 
// created elements to the same set. It is _potentially_ faster than 
 
// having to reselect the entire collection each time. 
 
var blocks = $('.blocks', '#container'); 
 

 
// Iterate over each item using the callback function which 
 
// receives the index number (0-indexed) and the actual 
 
// HTMLElement in each iteraction 
 
blocks.each(function(idx, item) { 
 

 
    // `this` and `item` are the same thing in this case 
 
    console.log(this === item); 
 

 
    // `item` is an HTMLElement, it's not a wrapped jQuery object 
 
    var text = item.textContent; 
 

 
    // you can also get the jQuery item object by using the index; 
 
    // this doesn't require you to construct a new jQuery object 
 
    var $item = blocks.eq(idx); 
 

 
    var value = $item.val(); 
 

 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

これとあなたの例との違いは、あなたが選択し直す維持する必要がないことですより速いオブジェクトを再構成することができます。この場合、for()または$.each()を使用することには違いはありません。

+0

['textContent'](https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent)はプロパティであり、関数ではありません。また、IE9ではサポートされていません(これらはすべて['innerText'](https://developer.mozilla.org/en-US/docs/Web/API/Node/innerText)プロパティを使用しています)幅広いブラウザサポートが必要な場合は、jQueryの['.text()'](http://api.jquery.com/text/)機能を活用してください。 –

+0

いいえ、私の悪い、出力をチェックしていませんでした。 –

3

Javascriptには数多くのパフォーマンスに関するヒントがあります。

ここを見てください:What's the fastest way to loop through an array in JavaScript?

あなたは非常に有益な情報を見つけるでしょうが、TL; DRは、ここにあなたのケースに収まる、現在最速のループです:私はかなり確信している

var blocks = document.getElementsByClassName("blocks"); 
for (var i=0, len = blocks.length; i<len; i++) { 
    var val = blocks[i].textContent; 
    ... 
} 
+0

詳細を提供できますか?このアドバイスがこの特定のケースでどのように適用されるかについて – StriplingWarrior

+0

はい、しかし、彼はループ内で追加のID選択を行っています。これは、最初にイテレータベースのループを使用して得られる可能性のあるパフォーマンスの向上を上回る可能性があります。 – StriplingWarrior

+0

あなたは正しいですが、彼の質問は彼がどのようにパフォーマンスを得るかということでした。しかし、この利得はそれほど大きくなく、「TL; DR」はアレイをループする最速の方法を紹介しました。 これはすべての場合に当てはまりません(ブラウザにはJSエンジンの実装が異なるなど) ユーザーの都合に合うように回答を編集しています。ありがとうございました。 – Mattyyyy

1

$("#block_"+i)のコストは、$(this)と比較して十分に高く、より効率的なforループを使用して得られるパフォーマンスの向上を相殺します。これはおそらくわずかより効率的に次のようになります。それ以外のものは何でもあなたのループの中でやっていることは、あなたが大幅に改善いずれかの方法を見ないであろうことは十分に高価になること

var blocks = $(".blocks"); 
for(var i = 0, len < blocks.length; i++) { 
     var val = $(blocks[i]).text(); 
     ... 
}); 

しかし、かなり特定。

ここでパフォーマンスが問題になる場合は、設計レベルまたはアルゴリズムレベルで大規模な改善が可能かどうかを確認するための高度なアプローチをお勧めします。それ以外の場合は、保守が最も簡単なコードを使用してください。

+0

まあ、私はアルゴリズムを改善することはできません。しかし、ありがとう。最後に、正確な答えは、私の "超広範な"質問に合っています。 –

関連する問題