具有ID的jQuery选择器的性能
我知道在jQuery中如果我们使用ID
来选择元素,那就非常有效。我对这个选择器有一个疑问:
请考虑这3个选择器:
$('#MyElement') $('#Mytbl #MyElement') $('#Mytbl .MyClass')
哪一个更快,为什么?我如何检查在jQuery中选择我的元素所用的时间?
直接ID选择器始终是最快的。
我根据你的问题创建了一个简单的测试用例……
http://jsperf.com/selector-test-id-id-id-id-class
选择嵌套ID是错误的,因为如果ID是唯一的(它应该是唯一的),那么它是否嵌套并不重要。
这是在某些javascript调用之间停止时间的方法
selectorTimes = []; var start = new Date().getTime(); $('#MyElement') selectorTimes.push(new Date().getTime()-start); start = new Date().getTime() $('#Mytbl #MyElement') selectorTimes.push(new Date().getTime()-start); start = new Date().getTime() $('#Mytbl .MyClass') selectorTimes.push(new Date().getTime()-start); console.log(selectorTimes);
我认为第二个选择器效率不高,如果你有一个domid直接选择它:$(’#MyElement’)
第一个是最快的,因为它只有1个属性可供查找。 然而,
document.getElementById("MyElement")
但是更快。 它是原生的javascript,与jQuery不同,浏览器会立即知道你想要做什么,而不是必须运行大量的jQuery代码来弄清楚你正在寻找什么。
您可以使用jsPerf运行速度测试,以比较function: 测试用例 。 结果:
$('#MyElement') Ops/sec: 967,509 92% slower $('#Mytbl #MyElement') Ops/sec: 83,837 99% slower $('#Mytbl .MyClass') Ops/sec: 49,413 100% slower document.getElementById("MyElement") Ops/sec: 10,857,632 fastest
与预期的一样,本机getter是最快的,其次是jQuery getter,只有1个选择器,低于原生速度的10%。 具有2个参数的jQuery getter甚至不接近本机代码的每秒操作,尤其是类选择器,因为与ID相比,类通常应用于多个元素。 (本机ID选择器在找到一个元素后停止搜索,我也不确定jQuery是否也这样做。)
这个给你。 请参阅每个示例顶部的注释:
//fastest because it is just one id lookup: document.getElementById("MyElement") with no further processing. $('#MyElement') //a little slower. JQuery interprets selectors from right to left so it first looks up for #MyElement and then checks if it is hosted in #Mytbl $('#Mytbl #MyElement') //the slowest of all. JQuery interprets selectors from right to left so it first finds all elements with .MyClass as their class and then searches for those hosted in #Mytbl. $('#Mytbl .MyClass')
如果可以的话,总是只使用id(就像第一个例子一样),但是如果必须将多个选择器和类链接在一起,请尝试将最严格的选择器和类放在右边。 例如id。 因为JQuery从右到左解释选择器。
几件事:
- 更多选择器=慢搜索。 如果您可以使用较少的谓词获得所需的结果,请执行此操作。
- 通过ID获取元素比通过类获取元素更快。 getElementById是JavaScript的核心function,经过大量优化,因为它经常使用。 尽可能利用这一点。
- 空格选择器(”)比子选择器(’>’)昂贵得多。 如果您可以使用子选择器,请执行此操作。
这些规则适用于CSS,因为它们执行JavaScript和jQuery。
此外,如果您需要嵌套选择器,使用$()。find()。find()会更快
http://jsperf.com/selector-test-id-id-id-id-class/2
$('#Mytbl .MyClass') $('#Mytbl').find('.MyClass')
后者的速度提高了约65%。
显然第一个, $("#MyElement")
比其他2快。
访问具有其id的元素总是更快但有时我们必须在某个容器中找到一些元素。 在这种情况下,我们更喜欢.find()
或.filter()
(取决于具体情况)。
选择器之间的区别取决于浏览器到浏览器。 例如,如果你通过IE上的类访问它将比FF慢。 访问具有类而不是ID的元素时,FF更快。
在你的第二个例子中,即$("#mytbl #MyElement")
,在这里你找到了#MyElement
下的#mytbl
,这是合法但不合适的方式。 由于您已经知道元素的ID(假设您的页面上只有一个带有此id的元素),因此最好使用$("#MyElement")
。 $("#mytbl #MyElement")
将首先读取#mytbl并遍历以查找其下的#MyElement,因此耗时且缓慢。
要测试不同的情况,您可以编写小片段来循环读取/访问至少10000个元素,否则很难确定哪个方法更快。
最快的将是:
$('#Mytbl', '#MytblContainer' );
因为在这种情况下,jquery不必搜索整个dom树来查找’#Mytbl’。 它将仅在给定的范围内进行搜索。 IE它只会搜索’#MytblContainer’。
我会说第一个是最快的,因为你只是在搜索一个id。
和
$('#Mytbl .MyClass')
是最慢的,因为你没有指定具有类“MyClass”的元素的类型