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

Javascript jQuery—在处理XML时提高选择器性能,javascript,jquery,xml,performance,Javascript,Jquery,Xml,Performance,我处理的XML文件在使用XPath样式选择器选择节点时性能非常慢 下面是运行速度特别慢的部分代码 for (i=0;i<lanes.length;i++) htmlContents += GetLaneInfo($(this).find("Lane[num='"+lanes[i]+"']").attr('avg')); 在您的示例xml数据中,我们可以看到num属性已排序,如果是这样,请尝试为该数据实现:)尝试以下操作: 我设法提高了速度。 p、 它基于这样一个事实,即在每个

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

下面是运行速度特别慢的部分代码

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

在您的示例
xml
数据中,我们可以看到
num
属性已排序,如果是这样,请尝试为该数据实现:)

尝试以下操作:

我设法提高了速度。


p、 它基于这样一个事实,即在每个xml节点中,所有通道的顺序都是相同的。

对这样简单的标记使用xml解析是一种浪费。如果您想提高速度,使用索引of子字符串是更好的方法

我编辑了@Royi Namir的jsperf并添加了我自己的版本(恰当地命名为“螺旋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);
  }
}
var find='';
var start=-1;
var-end=-1;
var skip1=0;
var skip2='avg=“”.长度;
//
对于(i=0;i”,开始);
htmlContents+=GetLaneInfo(xml.substring(start,end));
start=xml.indexOf(find,end);
}
}

实际上,您可能不想使用上述版本,因为它依赖于统一格式化的XML(请参阅:“skip2”变量/常量)。但是,如果您真的想提高性能/速度,那么采用这种方式是目前为止最快的。

我知道现在已经晚了,但这里有一个可行的高性能解决方案:


你可以用最快的javascript实现:)@Royi我如何用JS实现这一点(轻松/快速)?此外,使用XML示例更新。这将非常有效,但并非所有车道都始终存在于XML中,可能存在差距,即1、2、3、6、7、8等。这在这种情况下不起作用,是吗?@chris我明天可以写一个答案吗?我会把它修好并给你留言。
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);
  }
}