$()。每个vs $ .each vs for循环在jQuery?
我无法理解为什么它发生。
我在这里读到:
第一个$ .each构成一个单一的函数调用来启动迭代器。
第二个$(foo.vals).each使得三个函数调用来启动迭代器。
- 第一个是$(),它产生一个新的jQuery包装集(不知道在这个过程中有多less个其他的函数调用)。
- 然后调用$()。each。
- 最后,它使内部调用jQuery.each来启动迭代器。
在你的例子中,至less可以忽略不计。 但是,在嵌套的使用场景中,您可能会发现性能成为问题。
最后,jQuery Enlightenment中的Cody Lindley不推荐使用$ .each进行大于1000次的迭代,因为涉及函数调用。 使用正常的(var i = 0 …循环。
所以我用这个jsperf来testing它:
(任务:findTr的谁检查框中的checkbox,并颜色tr。)
这是jsbin
但看看jsperf
反对所有的期望, 相反是真的。 (铬和FF和IE)
$().each
使用$().each
(调用三种方法最快等)。
这里发生了什么?
您的testing太重,无法真正确定三个循环选项之间的实际差异。
如果你想testing循环,那么你需要尽可能地从testing中删除尽可能多的非相关工作。
现在,您的testing包括:
- DOMselect
- DOM遍历
- 元素突变
与环路本身相比,所有这些都是相当昂贵的操作。 当删除额外的东西,循环之间的差异更为明显。
http://jsperf.com/asdasda223/4
在Firefox和Chrome中, for
循环都比其他循环快100倍以上。
好
-
$.each()
是一个正在执行的jQuery函数,它将被用来迭代你的列表,所以开销应该是jQuery函数,以及为列表中的每个项目调用该函数的开销。 在这种情况下 -
$(thing).each()
这个背后的想法是$(thing)
一个jQuery实例,然后遍历这个实例(.each
在那个实例上)。 在你的情况,因为你调用它的实例已经是一个jQuery对象,开销是最小的(你是一个实例,哦,是的,你是)。 -
for()
在这种情况下,除了在每次迭代中查找列表的长度之外,根本没有任何开销。
考虑做:
var l = g.length; for (var i=0;i<l;i++) { // code; }
根据你的HTML,大部分时间都可以在Sizzle Jqueryparsing器中find文档中的select器。
另外请注意,我不认为你的select器是最好的,除非事情发生了明显的变化,最近jQueryselect器从右到左计算,考虑限制select器的范围,通过对第一个标记下面的所有内容执行.find()
ID,因为它将只search文档的一个子集。
不同的方法来你的“任务” http://jsfiddle.net/ADMnj/17/
但我想性能问题来自于你不select正确的事情
#t tr input:checkbox:checked VS #t tr :checkbox:checked
坚持正确的方式来检查是否checkbox被选中将是这样调用它
#t tr input[checked="checked"]
W3.ORG的select器列表见E [foo]
最后但并非最不重要的是最短的代码也可能是你从3行到4行和5行代码的轻微性能不同,但不能certificate这一事实