【问题标题】:Why is jQuery's $.each so fast?为什么 jQuery 的 $.each 这么快?
【发布时间】:2015-04-23 15:28:21
【问题描述】:

我必须将大量 XML 数据解析为对象。我想到了三种将 XML 转换为对象的方法:

XML

<myXml>
  <tag1 val = "someVal"/>
  <tag2 val = "someVal"/>
  <tag3 val = "someVal"/>
</myXml>

选项 1:使用 .find()

var xml = getMyXml();
var myObj = {
   1 : xml.find('tag1').attr('val'),
   2 : xml.find('tag2').attr('val'),
   3 : xml.find('tag3').attr('val'),
}

选项 2:使用 .each()

var xml = getMyXml();
var myObj = {
   1 : 'tag1',
   2 : 'tag2',
   3 : 'tag3',
}
$.each(myObj, function(i,e){
  myObj[i] = xml.find(e).attr('val');
});

选项 3:数组

var xml = getMyXml();
var myArr = ['tag1','tag2','tag3']
var myObj = {};
for(var i = 0; i < myArr.length; i++){
 myObj[i] = xml.find(myArr[i]).attr('val');
}

使用此性能 http://jsperf.com/each-vs-arraysdfsdf 选项 2 比其他两个选项快 82%。为什么?

【问题讨论】:

  • 奇怪。我本来希望展开选项 1 最快,因为它避免了任何额外的开销。
  • 我不了解底层的工作原理,但我唯一的猜测是在选项 1 中它每次都在重建对象?但是,我对选项 3 与选项 1 的速度相同感到更加困惑。
  • 必须优化每个回调的内容,但我目前不知道。其他人有什么想法吗?
  • source 可能会提供一些见解。看起来(for item in object) 可能只是比for i 循环快。可能值得将其添加到测试中。
  • @Jack:如果有的话,我现在几乎可以肯定地期望$.each 会更慢。一定是魔法! :)

标签: jquery xml


【解决方案1】:

如果您不混合使用数组和 jquery,只需将纯 javascript 函数与数组一起使用,那么结果将完全不同并且速度太快。使用 jquery 时,每个选择器开销都得到了优化,这可能是您的测试用例更快的原因。

var len = digitalArr.length; //Cache the length
var i = 0;
for (; i < len ; i++) {
  obj[i] = xmlobj.getElementsByTagName(''+digitalArr[i]+'')[0].getAttribute('val');
}

查看jsperf结果here

【讨论】:

  • 这更有意义。但是为什么选项 1 还是那么慢呢?
  • 我也想知道,找到了一些文章,这是一篇很好的文章developers.google.com/v8/design?csw=1#prop_access。属性访问有很多开销。每次添加属性时,都会根据之前的属性创建一个新的隐藏类,然后更新它的值。
猜你喜欢
  • 1970-01-01
  • 2022-01-14
  • 2018-03-22
  • 2021-12-19
  • 2013-09-09
  • 1970-01-01
  • 2011-06-02
  • 2020-06-08
  • 1970-01-01
相关资源
最近更新 更多