比较 $("#foo .bar") 和 $(".bar", "#foo") 的性能

2024-03-15

向下滚动查看getById.getByClassName vs. qSA比较!


如果我们想选择类的所有元素"bar"位于具有 ID 的元素内"foo",我们可以这样写:

$( '#foo .bar' )

or this:

$( '.bar', '#foo' )

当然还有其他方法可以实现这一点,但为了这个问题,我们只比较这两种方法。

那么,上述哪种方法效果更好呢? (哪个需要更少的时间来执行?)

我写了这个性能测试:

(function() {
    var i;
    
    console.time('test1');
    for( i = 0; i < 100; i++ ) {
        $('#question-mini-list .tags');
    }
    console.timeEnd('test1');
    
    console.time('test2');
    for( i = 0; i < 100; i++ ) {
        $('.tags', '#question-mini-list');
    }
    console.timeEnd('test2');
})();

您必须从控制台中执行它Stack Overflow 起始页。我的结果是:

Firefox:
测试1:~90ms
测试2:~18ms

Chrome:
测试1:~65ms
测试2:~30ms

Opera:
测试1:~50ms
测试2:~100ms

因此,在 Firefox 和 Chrome 中,第二种方法的速度要快好几倍——正如我所预期的那样。然而,在 Opera 中情况却相反。我想知道这是怎么回事。

您能否在您的机器上运行测试并解释为什么 Opera 的表现不同?


Update

我编写了这个测试,目的是调查 Opera 的 qSA 是否真的超快。事实证明,确实如此。

(function() {
    var i, limit = 5000, test1 = 'test1', test2 = 'test2';

    console.time( test1 );
    for( i = 0; i < limit; i += 1 ) {
        document.getElementById( 'question-mini-list' ).getElementsByClassName( 'tags' );
    }
    console.timeEnd( test1 );

    console.time( test2 );
    for( i = 0; i < limit; i += 1 ) {
        document.querySelectorAll( '#question-mini-list .tags' );
    }
    console.timeEnd( test2 );
})();

同样,您必须从 Stack Overflow 起始页上的控制台内运行此代码。我使用了 IE9 的 Firebug Lite 书签(因为该浏览器没有实现console.time).

所以,我比较了这个方法:

document.getelementById( 'A' ).getElementsByClassName( 'B' );

对于这个方法:

document.querySelectorAll( '#A .B' );

我已在每个浏览器中连续执行上述脚本五次。算术平均值为:

(所有数字均以毫秒为单位。)

因此,第一种方法的性能在测试的浏览器中几乎相同(16-36ms)。然而,虽然 qSA 比第一种方法慢得多,但在 Opera 中它实际上更快!

所以,qSA 优化是可能的,我想知道其他浏览器还在等什么......


如果浏览器支持,jQuery/Sizzle 将避免使用基于 JavaScript 的 Sizzle 引擎querySelectorAll,并且如果您传递了有效的选择器(没有自定义的非 CSS 选择器)。

这意味着您最终要比较的实现querySelectorAll,假设您正在测试支持它的浏览器。

jQuery 或 Sizzle 使用了其他优化,因此在不同浏览器中比较不同类型的 DOM 选择时会很棘手。

Opera 的性能结果的原因似乎是他们有一个非常高度优化的querySelectorAll执行。qSA,作为一种相对较新的方法,与旧方法(例如getElementsByTagName.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

比较 $("#foo .bar") 和 $(".bar", "#foo") 的性能 的相关文章

随机推荐

  • 如何管理需要AsyncTask调用的不同任务

    我有一个外部库可以使用 它通过互联网与服务器进行通信 每当我需要从互联网获取一些信息时 Android 都会强制我使用异步任务 到目前为止没有问题 但是 我收到越来越多的任务来从互联网检索 以不同方式 数据 并且我不喜欢为每个调用增加不同的
  • 为什么我的 Julia 代码运行速度比 JavaScript 慢?

    最近 我对 Julia lang 很感兴趣 因为它声称是一种具有接近 C 性能的动态语言 然而 到目前为止我的经验并不好 至少在性能方面 我正在编写的应用程序需要随机访问特定的数组索引 然后将它们的值与其他特定的数组索引进行比较 经过多次迭
  • 返回 AJAX 调用数据的 JavaScript 函数 [重复]

    这个问题在这里已经有答案了 我想创建一个 JavaScript 函数 它返回 jQuery AJAX 调用的值 我想要这样的东西 function checkUserIdExists userid return ajax url theur
  • Spring 属性占位符不起作用

    我在 stackoverflow com 上读过类似的问题 但没有一个解决方案对我有帮助 我使用的配置如下 maven项目结构 这src main resources properties app properties file possi
  • angular.js 控制器作为使用 $template 缓存服务的语法模板绑定

    我之前已经使用过 Angular JS 但现在我在 Angular JS 中使用控制器作为语法 并且无法绑定模板 我的控制器代码 function angular module vkApp controller Feeds Feeds fu
  • 支持语音的 ASP.NET 应用程序

    我们正在开发一个 ASP NET Web 应用程序 该应用程序需要通过语音输入一些数据 用户可以使用普通用户界面输入一些数据 但是 我们需要一个附加功能 让他可以通过语音输入数据 我们可以修复语音命令 例如输入 value1 到 data1
  • Jooq、Spring 和 BoneCP 连接关闭两次错误

    我正在将 Spring 4 0 0 以及 jOOQ 3 2 0 和 BoneCP 0 8 0 用于 Web 应用程序 我的 PersistenceContext 配置与本指南相同 请浏览一下 代码有点太多 无法粘贴到此处 http www
  • 无法找到资源 ID - Android Gradle 插件 3.4.0

    当从多模块项目中的 Android Gradle Plugin 3 3 2 迁移到 3 4 0 并执行时connectedAndroidTest我看到一个致命的异常 Google Play 服务共享类StringResourceValueR
  • 循环遍历datagridview

    我的是一个Windows应用程序 包含名为 BOM 和 BOMSelected 的表单 BOM中有一个datagridview 其中包含checkbox列 当用户选择checkbox时 所选行应该在其他形式的datagridview中看到
  • 如何在 Laravel 5.5 中进行迁移?

    我创建了一个 Auth 项目拉拉维尔 5 5并创建了新的迁移 当我迁移时 我收到此错误消息 在 Connection php 第 647 行 SQLSTATE 42S01 Base table or view already exists
  • 安装 apk 文件时出现错误“软件包似乎已损坏”

    我遇到了一个奇怪的问题 将 Android Studio 从 2 3 3 更新到 3 0 后 我收到此错误 问题是当我尝试安装 apk 文件时 它说 应用程序未安装 该软件包似乎已损坏 我尝试过在调试版本和发布版本中生成 apk 并尝试安装
  • 有未提交的工作待处理。请在调用前提交或回滚

    我有一个批处理课程 public class BatchCreateGCalendars implements Database Batchable
  • 如何在Java中使用TLSV1或SSLV3进行第一次握手(Client Hello)?

    当我执行以下代码时 为什么第一次握手是SSLv2 而不是TLSv1或SSLv3 如何在Java中使用TLSV1或SSLV3进行第一次握手 String host www google com String url adsense sourc
  • 如果在 bash 中通过管道传输,使用 subprocess 和 xclip 的 Python 脚本会挂起

    我有一个 python 脚本 需要将一些值输出到 stdin 并将另一个字符串复制到剪贴板 我正在使用该模块subprocess执行xclip效用通过Popen像这样的东西 clip py import subprocess from su
  • 如何在 sqlalchemy 中配置故障转移

    sqlalchemy 中是否有一种方法可以让开发人员指定多个 mysql 主机来尝试连接 并且如果第一个主机连接失败 它将自动故障转移到第二个主机 我在 mysql 上有一个解决方案 使用名为MySQL 连接器 Python who s 连
  • Google Workspace - 创建空间 - Google Apps 脚本

    提交 Google 表单后 我想触发一个 触发器 在 Google 工作区中创建一个 空间 我在 GAS Google Apps 脚本 中找不到任何记录 Google Workspaces 的文档 Source https develope
  • 类分割错误 (11)

    请按照以下步骤操作 创建新的Firemonkey Moblie Application Add TGeustureManager表单的组成部分 Add 2 TButton表单的组件 Button1 Text Button1 做某事 Butt
  • Django IPython sqlite 抱怨天真的日期时间

    我在 Django 1 4 中有一个使用 sqlite db 的新项目 使用 django extensions shell plus 也没有问题 当我安装 IPython 时 两者shell and shell plus开始抱怨 path
  • 禁用输入的值将不会被提交

    这是我在 Firefox 中通过 Firebug 发现的 Values of disabled inputs will not be submitted 在其他浏览器中也是这样吗 如果是这样 原因是什么 disabled输入不会提交数据 U
  • 比较 $("#foo .bar") 和 $(".bar", "#foo") 的性能

    向下滚动查看getById getByClassName vs qSA比较 如果我们想选择类的所有元素 bar 位于具有 ID 的元素内 foo 我们可以这样写 foo bar or this bar foo 当然还有其他方法可以实现这一点