2012-01-31 30 views
4

我正在處理一個XML文件,該文件在選擇具有XPath樣式選擇器的節點時性能非常低。jQuery - 處理XML時提高選擇器性能

這裏是運行particularily慢

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

我相信這段代碼的最慢的部分是Lane[num=X]選擇代碼的一部分,我怎麼能改善這個性能?我可以緩存$(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這是最快:) – 2012-01-31 12:29:01

+0

上傳XML樣本 – 2012-01-31 12:31:59

+0

@ Royi如何在JS中執行此操作(輕鬆/快速)?此外,更新了XML樣本。 – Chris 2012-01-31 13:18:40

回答

2

試試這個:

http://jsperf.com/1f

我設法提高了速度。 enter image description here

p.s.它基於每個xml節點中所有通道的順序相同的事實。

+0

這將工作得很好,但並不是所有的通道總是出現在XML中,可能有差距,即1,2,3,6,7,8等。這個場景會嗎? – Chris 2012-01-31 16:23:39

+1

@chris明天我可以寫一個答案嗎?我會修復它併發送給你一條消息。 – 2012-01-31 16:39:45

+0

@Chris和no - 它不會工作 – 2012-01-31 16:39:59

1

使用XML解析這種簡單的標記是浪費。如果你想要速度使用indexOf子串是優越的方法。

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

我編輯@Royi納米爾的jsperf並加入我自己的版本(恰當地命名爲 「螺絲釘XML」)。它的運行速度比他優化的XML解析版本快兩倍。

下面是代碼將與OP的例子一起問的問題。 「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); 
    } 
} 

在現實中,你可能不希望使用一個版本像上面的,因爲它取決於對XML進行統一格式(見:「SKIP2」變量/常數)。但是如果你真的想要這樣做,性能/速度是迄今爲止最快的。