javascript - JQuery 选择器性能和比较问题

标签 javascript jquery performance

所有三个操作都在执行相同的操作。 谁能解释不同性能的原因?

console.time('first');
for(guid in ALLGUID){   
   $('.'+guid).find('.cell-taskname').find('.cell-text').text()
}
console.timeEnd('first');

console.time('second');
for(guid in ALLGUID){
 $('.'+guid).find('.cell-taskname .cell-text').text()
}
console.timeEnd('second');

console.time('third');
for(guid in ALLGUID){
 $('.'+guid+' .cell-taskname .cell-text').text()
}
console.timeEnd('third');

首先:~3500.000ms

秒:~3700.000 毫秒

第三:~38000.000 毫秒(是的,它是 38 秒。)

场景说明:我有一个巨大的表,我正在遍历所有表行。这里的 Guid 是表行的唯一键和类名。 cell-taskname 是 table-row 的每个第一列内的 div,.cell-text 是包含文本的 span。

最佳答案

这一切都与选择器从右到左处理的事实有关。

在您的第一个和第二个示例中,DOM 的主要搜索仅针对具有给定 GUID 类的元素。然后,您只需在这些元素中搜索单元格。

但在您的最后一个示例中,使用单个选择器,引擎会执行以下操作:

  1. 列出所有 .cell-text元素。

  2. 删除没有祖先匹配 .cell-taskname 的那些从列表中。

  3. 删除所有没有祖先匹配 .<your-guid-here> 的剩余的从列表中。

如果有很多 .cell-text,您可以看到这需要更长的时间元素和只有少数.<your-guid-here>元素。你说过 .<your-guid-here>元素是唯一的(大型表中的一行),因此性能差异在这里很有意义。

有关从右到左匹配的更多信息,请参阅 this question and its answers .

关于javascript - JQuery 选择器性能和比较问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25238555/

相关文章:

mysql - 什么时候不对表进行分区(MySQL)?

javascript - 在 Materialise Carousel 上禁用触摸

javascript - 在 jQuery 中选择没有文本节点的 <p> 元素

javascript - 当鼠标悬停在提交按钮图像上时,我需要帮助将其更改为另一个图像

没有 ID 的 Jquery 悬停

mongodb - 查询 : redis or mongodb?

java - 如何阻止每秒帧数下降?

javascript - for 在 <div class ='col-sm-4' > 上循环内容,但是当内容太长时 for 循环会跳过一个地方

Javascript 定义类

javascript - evt.preventDefault 在 IE 和 Edge 中无法处理鼠标移动事件,甚至尝试过 evt.returnValue = false;但无法阻止传播