我在处理一个在使用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>
答案 0 :(得分:2)
答案 1 :(得分:1)
使用XML解析进行这种简单的标记是一种浪费。如果你想使用 indexOf 和 substring 来提高速度是一种优越的方法。
我编辑了@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)
答案 3 :(得分:0)
好吧,在您的示例xml
数据中,我们可以看到num
属性已排序,如果是,请尝试为该数据实现http://en.wikipedia.org/wiki/Bisection_method:)