2012-01-31 11 views
4

XPathスタイルセレクタを使用してノードを選択すると、パフォーマンスが非常に低下するXMLファイルを処理しています。ここでjQuery - XML処理時のセレクタのパフォーマンスを改善する

は、私はどのように私はこれのパフォーマンスを向上させることができ、このコードの最も遅い部分がLane[num=X]セレクタであると考えていparticularily遅い

for (i=0;i<lanes.length;i++) 
    htmlContents += GetLaneInfo($(this).find("Lane[num='"+lanes[i]+"']").attr('avg')); 

を実行するコードの一部ですか? $(this).find("Lanes")をキャッシュして後で検索することはできますか?

XMLサンプル:

<Data time="10:50"> 
    <Lane num="102" avg="2.0"/> 
    <Lane num="103" avg="2.0"/> 
    <Lane num="104" avg="2.0"/> 
    <Lane num="112" avg="2.0"/> 
    <Lane num="113" avg="2.0"/> 
    <Lane num="114" avg="2.0"/> 
    <Lane num="115" avg="2.0"/> 
    <Lane num="122" avg="0.9"/> 
    <Lane num="123" avg="1.0"/> 
    <Lane num="124" avg="1.0"/> 
    <Lane num="132" avg="0.7"/> 
    <Lane num="134" avg="0.7"/> 
    <Lane num="142" avg="0.8"/> 
    <Lane num="153" avg="0.4"/> 
    <Lane num="154" avg="0.6"/> 
</Data> 
+1

は、あなたがそれを行うことができますJavaScriptで最も速く:) –

+0

は、XMLサンプル –

+0

をアップロードしています@ Royi JSでこれを(簡単に/速く)どうすればいいですか?また、XMLサンプルで更新されました。 – Chris

答えて

2

ためhttp://en.wikipedia.org/wiki/Bisection_methodを実装しようとした場合、あなたの例xmlデータでは、我々は、num属性がソートされていることを見ることができ、これを試してみてください。

http://jsperf.com/1f

Iveは速度を上げることができました。 enter image description here

p.s.すべてのレーンが各xmlノードで同じ順序であるという事実に基づいています。

+0

これは素晴らしいですが、すべてのレーンが常にXMLに存在するわけではありません。つまり、1,2,3,6,7,8などのギャップが存在する可能性があります。このシナリオでしょうか? – Chris

+1

@chris明日は答えを書くことができますか?私はそれを修正し、あなたにメッセージを送るでしょう。 –

+0

@Chrisとno - それは動作しません –

1

このような単純なマークアップにXML解析を使用することは無駄です。 indexOf部分文字列を使用して速度を望む場合は、優れた方法です。

http://jsperf.com/1f/2

私は@Royi Namirのjsperfを編集し、自分自身のバージョン(適切な名前 "ネジのxml")を追加しました。最適化されたXML解析バージョンよりも2倍高速に動作します。

ここでは、問題のOPの例を使用してアラインするコードを示します。 "xml"変数はXMLを表す単なる文字列です。それは一様にフォーマットされるXMLにかかっているので、おそらく上記のようなバージョンを使用したくない現実に

var find = ''; 
var start = -1; 
var end = -1; 
var skip1 = 0; 
var skip2 = ' avg="'.length; 
// 
for (i=0;i<lanes.length;i++) { 
    find = 'num="' + lanes[i] + '"'; 
    skip1 = find.length; 
    end = -1; 
    start = xml.indexOf(find, 0); 
    while (start != -1) { 
    start = start + skip1 + skip2; 
    end = xml.indexOf("\"/>", start); 
    htmlContents += GetLaneInfo(xml.substring(start, end)); 
    start = xml.indexOf(find, end); 
    } 
} 

(参照:定数/「SKIP2」変数)。しかし、あなたが本当にパフォーマンス/スピードをやりたいのであれば、この方法は一番速いです。

1

私はこれが遅れているが、ここで実行可能な高性能ソリューションを知っている:

http://jsperf.com/1f/3

enter image description here

関連する問題