jQuery选择器性能:一个奇怪的案例

7
我测试了两个ID选择器之间的差异,第一个是正常的:$('#lol'),第二个是相同的但放置在多个括号之间:$((((('#lol')))))
我在jsperf上进行了测试,使用了Firefox和Chrome浏览器。结果很有意思: 在Firefox中,第一个(正常选择器)比第二个慢40%(!!!)。 在Chrome中,第二个比第一个慢0.84%。
为什么会有这样的差异?有人能解释一下吗?
jsperf.com可靠吗?
你可以在这里看到测试:

http://jsperf.com/ghshshsrd

我会在其他浏览器上进行测试,仅供娱乐。

(编辑:顺便说一下,我使用的是 Mac OS X)


还在Opera和Safari上进行了测试,没有什么实质性的区别。只有Firefox出现了这种奇怪的结果。 - FLX
1
如果您不是从 Firefox 浏览器运行测试,那么对我来说两者都是相似的。 - Arun P Johny
如果你想测试 $(),为什么要调用 .html()?如果有任何差异,.html() 调用将完全掩盖它们。 - Esailija
尝试在Firefox中禁用Java Applet插件,结果会类似。 - Ram
@undefined:Java 已经被禁用了。如果我激活它,差异会更大:D - FLX
显示剩余4条评论
2个回答

2
正如其他人所指出的,这两个语句得到的结果之间的差异微不足道。即使测试相同语句两次,也很难获得两个完全相同的Ops/sec值。
此外,您提到了“一个测试”,而不是“多个测试”。如果结果看起来奇怪,只需重复测试-不要忘记,如果浏览器在测试运行过程中缺乏资源,则可能会发生异常结果。
对我而言,JSPerf一直是可靠的 - 足以用于演示优化技术(这是一个经典例子)。

0

实际上,选择元素的两种方式没有真正的区别(除了可读性)。我创建了一个新的jsperf测试用例,更客观地衡量了这种情况:

-> http://jsperf.com/jquery-selector-performance-20130730

为什么你的测试结果如此奇怪?更可能的是你的测试场景不准确,而不是两个测试之间存在真正的性能差异。

你可以反转初始测试的顺序:首先检查代码$(((('#lol')))),然后再检查$('#lol')。我相当确定你会得到与当前测试完全相反的结果;-)

虽然我不是专家,但浏览器现在非常聪明,会缓存javascript代码/变量。此外,jQuery可能会在第一次调用后存储该值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接