【发布时间】:2013-12-25 01:01:46
【问题描述】:
我知道这个话题已经讨论过好几次了,但我正在寻找更技术和更详细的见解来了解真正发生的事情。
我设计了一系列测试来比较 jQuery 最基本的选择器“#id”和“.class”与各种原生 DOM 方法的速度。
我希望确切地找出结果为何如此。
这里是测试:http://jsperf.com/jqueryspeed
值得注意的是,getElementById 显然是最快的。 为了比较,我添加了 jQuery('#id') 和 jQuery.fn.init('#id') 作为测试,两者之间的区别在于第一个确实实例化了一个全新的 jQuery 对象,而第二个只运行原型函数,因此速度更快。所以,这两者之间的区别是可以理解的。
然而,我不明白的主要区别是 getElementById 的速度和 jQuery.fn.init 的速度之间的巨大差距,它有一个简单的测试来处理一个简单的 ('#id') 请求具体方式,回退到调用 getElementById 本身。
那么,为什么例如在 Chrome 上,这种方法比原生方法慢 8 倍,即使它基本上只是它的包装器?
它也比包装好的 getElementById $(document.getElementById('#id')) 慢大约 3-4 倍...
有什么想法吗?
【问题讨论】:
-
本机方法经过高度优化,
$.fn.init不仅仅是document.getElementById的“包装器”。那么为什么会有速度差异让您感到惊讶呢? -
它不仅仅是一个包装器,而且它有一个特殊的测试分支,导致最后简单地调用 getElementById。我对有开销并不感到惊讶,但开销如此之大!
-
getElementById非常快(尤其是在现代浏览器中)。因此,无论有多少开销,都将是$.fn.init的tiny 部分。如果您浏览代码,您将看到需要执行的操作。显然,这些操作没有得到优化和/或本质上是较慢的任务。与“轻任务加上其他较重的任务”相比,它是“轻任务”。 -
仅供参考,我添加了几个测试。一个只是
getElementById的薄包装。另一种是带有几个安全检查的薄包装纸。它们几乎和直接调用本机方法一样快。 jsperf.com/jqueryspeed/3
标签: javascript jquery performance dom getelementbyid