jQuery选择器的性能

jQuery选择器的性能,jquery,performance,selector,Jquery,Performance,Selector,这是选择器: $("div#myId") $("#myId") 比此选择器更快: $("div#myId") $("#myId") ?? 两者都很好,但我想提高性能。每一个a,$(“#myId”)比$(“div#myId”)快4倍 使用id值时,添加到选择器的任何其他内容都不会提高性能。浏览器已经有了所有id值的索引,因为文档中的所有id都应该是唯一的。向选择器添加其他内容只会使它必须测试更多的内容。例如,对于#myId,可以使用对document.getElementById(“myI

这是选择器:

$("div#myId")
$("#myId")
比此选择器更快:

$("div#myId")
$("#myId")
?? 两者都很好,但我想提高性能。

每一个a,
$(“#myId”)
$(“div#myId”)
快4倍

使用id值时,添加到选择器的任何其他内容都不会提高性能。浏览器已经有了所有id值的索引,因为文档中的所有id都应该是唯一的。向选择器添加其他内容只会使它必须测试更多的内容。例如,对于
#myId
,可以使用对
document.getElementById(“myId”)
的短路,但是在
div#myId
中,jQuery或它调用的函数必须首先将选择器分解为若干部分,找到具有正确ID的对象,然后检查它是否也是
div

如果您真的想绝对肯定地知道任何两个场景之间的性能差异,那么您必须编写一个性能测试(在类似的工具中),并在所有相关的浏览器中进行测试

通常,您应该遵循使用最简单的代码并以适当的性能完成任务的原则。这可能是
$(“#myId”)
,除非您真的试图优化纯性能,在这种情况下,您将使用
document.getElementById(“myId”)

而且,对于grins来说,jQuery根本就不快(它创建一个对象,运行一个构造函数,分析选择器,计算选择器,查看其他可以传递的选项,等等),因此,如果您真的关心优化性能,那么您首先就不会使用jQuery。也就是说,jQuery大大加快了编写代码的速度,因此在许多情况下都是值得的

有关性能比较,请参见jsperf:

在Chrome中,这三者之间有很大的区别:

$("div#myId")                    -    446,589 ops/sec
$("#myId")                       -  1,705,994 ops/sec
document.getElementById("myId")  - 32,278,617 ops/sec
因此,
$(“#myId”)
$(“div#myId”)
文档快约4倍。getElementById(“myId”)
$(“#myId”)
快19倍。这比我预期的差异更大

这是一个图形表示法(条形图越长,速度越快):

当你测量而不是猜测时,你总会学到一些东西


深入研究jQuery选择器处理代码,您会看到:

  • 检查是否通过了任何选择器
  • 检查它是否是字符串,以及它是否看起来像HTML
    “”
  • 如果看起来不像简单的HTML,请在其上运行此
    /^(?:\s*()[^>]*|#([\w-]*)$/
    正则表达式
  • 如果正则表达式显示选择器只是
    “#xxxx”
    ,则调用
    document.getElementById()
  • 如果它看起来像更复杂的HTML(可能带有属性),则将该HTML处理为DOM对象
  • 如果没有任何这些特殊字符串,则运行
    .find()
    以查找匹配的选择器。运行
    .find()
    将选择器从要评估的Sizzle引擎中传递出去(从头开始)
  • Sizzle引擎然后在选择器上运行另一个正则表达式,再次寻找它可以选择更快方式的快捷方式
  • 最后,如果没有任何快捷方式通过并且选择器中没有特殊项,则调用
    querySelectorAll()
  • 等等,处理其他可能要传递的非字符串内容(DOM对象、jQuery对象等)
  • 因此,我从中吸取了一些东西。首先,有一个简单“#xxxx”字符串的快捷方式,它可以避免许多其他处理。毫不奇怪为什么它会更快。其次,任何快捷方式都可以避免深入到最终调用
    querySelectorAll()的嘶嘶声选择器求值代码的深处
    将加快速度。

    每一次,
    $(“#myId”)
    $(“div#myId”)快4倍

    当使用id值时,您添加到选择器的任何其他内容都不会提高性能。浏览器已经有了所有id值的索引,因为文档中的所有id都应该是唯一的。向选择器添加其他内容只会使它必须测试更多的内容。例如,使用
    #myId
    ,对可以使用
    document.getElementById(“myId”)
    ,但在
    div#myId
    中,jQuery或它调用的函数必须首先将选择器分解为多个部分,找到具有正确ID的对象,然后检查它是否也是
    div

    如果您真的想绝对肯定地知道任何两个场景之间的性能差异,那么您必须编写一个性能测试(在类似的工具中),并在所有相关的浏览器中进行测试

    通常,您应该遵循使用最简单的代码并以适当的性能完成任务的原则。这可能是
    $(“#myId”)
    ,除非您真的试图优化纯性能,在这种情况下,您将使用
    document.getElementById(“myId”)

    而且,对于grins来说,jQuery根本就不快(它创建一个对象,运行一个构造函数,分析选择器,计算选择器,查看其他可以传递的选项,等等),因此,如果您真的关心优化性能,那么您首先就不会使用jQuery。也就是说,jQuery大大加快了编写代码的速度,因此在许多情况下都是值得的

    有关性能比较,请参见jsperf:

    在Chrome中,这三者之间有很大的区别:

    $("div#myId")                    -    446,589 ops/sec
    $("#myId")                       -  1,705,994 ops/sec
    document.getElementById("myId")  - 32,278,617 ops/sec
    
    因此,
    $(“#myId”)
    $(“div#myId”)
    文档快约4倍。getElementById(“myId”)
    $(“#myId”)
    快19倍。这比我预期的差异更大

    这是一个图形表示法(条形图越长,速度越快):

    当你测量而不是猜测时,你总会学到一些东西


    深入研究jQuery选择器处理代码,