一个标记名,多个attrs - 使用过滤器阻止查询或使用多个选择器更快?

时间:2011-03-03 11:12:35

标签: javascript jquery performance selector

我想知道以下哪个jQuery查询会更快。我希望匹配任何具有src属性或data-src属性的span标记。

var a = $('span[src],span[data-src]');


var b = $('span').filter('[src],[data-src]');

我的直觉是(b)但可能有一些我不知道的优化。

感谢。

更新:

基于100 x span[src],100 x span[data-src]和100 x span元素的快速测试:(a)大约快4到8倍,具体取决于浏览器。在IE8上它的速度要快得多(大约50次),在IE6 / 7上大约相同。

我想知道为什么它更快?

如果(a)jquery委托整个选择器查询可用的本地querySelectorAll。因此,在现代浏览器上看起来速度较慢的查询实际上非常快。

3 个答案:

答案 0 :(得分:1)

这只是一个假设,更多的是基于逻辑而不是测试。

在第一种情况下,选择器会选择span src属性。

在第二种情况下,选择器将选择所有span,然后使用attr span过滤src

所以,首先会更快。

如果我错了,请纠正我

答案 1 :(得分:1)

第一个版本将完成完整DOM树的两次传递;而第二个只一次

真正的答案需要对您的具体情况进行分析,即取决于您的DOM的复杂程度。此外,不同的jQuery版本可能会导致不同的结果。

答案 2 :(得分:1)

http://jsfiddle.net/B9Vmy/1/我运行了一些测试(使用firebug作为控制台的东西)

对于6000跨度(2000跨度,2000与src,2000,2000与data-src),这在大约8ms运行,因此选择部分是可忽略的。这么慢的原因是创建了jQuery对象(jQuery(element))。

虽然A仅对返回的结果只执行一次,但B对每个元素执行此操作,之后使用这些结果并对返回的结果再次执行此操作。

然后有可能用于选择元素的嘶嘶声引擎......看看过滤时间的笑声: - )