jQuery - 在处理XML时提高选择器性能

时间:2012-01-31 12:24:46

标签: javascript jquery xml performance

我在处理一个在使用XPath样式选择器选择节点时性能非常低的XML文件。

以下是特别缓慢运行的代码的一部分

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>

4 个答案:

答案 0 :(得分:2)

试试这个:

http://jsperf.com/1f

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

P.S。它基于以下事实:每个xml节点中的所有通道的顺序都相同。

答案 1 :(得分:1)

使用XML解析进行这种简单的标记是一种浪费。如果你想使用 indexOf substring 来提高速度是一种优越的方法。

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

我编辑了@Royi Namir的jsperf并添加了我自己的版本(恰当地命名为“screw xml”)。它的运行速度比优化的XML解析版快2倍。

以下是与问题中的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”变量/常量)。但是,如果你真的希望性能/速度这样做是迄今为止最快的。

答案 2 :(得分:1)

我知道这已经很晚了,但这是一个可行的高性能解决方案:

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

enter image description here

答案 3 :(得分:0)

好吧,在您的示例xml数据中,我们可以看到num属性已排序,如果是,请尝试为该数据实现http://en.wikipedia.org/wiki/Bisection_method:)