【问题标题】:Are data attribute css selectors faster than class selectors?数据属性 css 选择器比类选择器快吗?
【发布时间】:2012-09-11 21:21:56
【问题描述】:

几个月前this article 指出,实际上可以从网站开发中完全避免课程。

我的问题是,与类选择器相比,数据选择器的效率如何?

一个简单的例子是比较使用data-component='something'class='class1 class2 something anotherClass' 查询元素。

[data-<attr>='<value>'] 选择器将检查整个值与应拆分的类字符串。考虑到这一点,数据属性应该更快。

那么,为了细化这个问题,对于 CSS,我们是使用类选择器还是数据选择器更好?而且从 javascript 的角度来看,jQuery("[data-component='something']") 会比jQuery(".something") 更高效吗?

【问题讨论】:

  • 我不知道什么样的网络编程与那篇文章的诡辩有关,但我很确定这与我所做的无关。另外,如果您仔细阅读那篇文章,我怀疑它的作者对data- 属性的关注与对类的关注一样多;毕竟它们都代表着同一种“罪行”。
  • 至于你的问题,一些jsperf 测试可能有助于回答这个问题。我怀疑任何带有querySelectorAll() 等的现代浏览器都不会遇到任何困难。
  • 我越是考虑数据属性和样式而不是添加类,我就越喜欢它们。例如,隐藏块元素(如搜索框)的事实可以由 data-state='hidden' 指示。对于我这个开发人员来说,这似乎比“component widget-header touchable hidden rounded-top”更容易阅读。
  • 很遗憾,BLSully 似乎有点正确。这太令人震惊了......如果几个小时后没有更多答案,我将关闭这个问题。
  • @VladNicula 好吧,我猜这是口味问题;我不明白为什么data-state=hidden 与“隐藏”类真的有很大不同。无论如何,您的方法与该文章的主题完全相反,与类的做法完全相同。这篇文章的重点是,在标准 HTML 元素上发明的装饰器本质上是不可理解的,并且不如通过显式可读内容增强的表示描述的结构化方法。

标签: javascript css performance html css-selectors


【解决方案1】:

我不会说它是决定性的,但它确实看起来类选择器更快......我只是把它放在一起进行快速测试。

http://jsperf.com/data-selector-performance

编辑

基于 Vlad 和我的 jsperf 测试...如果性能是一个问题(尤其是 IE)...类仍然是要走的路

【讨论】:

  • 我也在测试这些类,将一些 querySelectorAll 添加到我的测试用例中。
  • jsperf.com/testing-data-atribute-selectors 是的,似乎 querySelectorAll 在数据属性上更慢。这太令人震惊了!我希望它们更快,因为没有字符串拆分来获取 \"\" 中的实际值。
  • 哇....在 IE9 中进行测试...单类选择器吹走数据选择器...而且在该测试中它甚至比 chrome 还要快.. IE 6300 ops/sec vs Chrome 的 4800 ...
  • 我不知道为什么这令人惊讶,对于给定的 CSSOM,有一组已知的类会影响样式,但属性选择器总是需要动态处理。也就是说,我真的不认为 css 选择器的性能应该以牺牲易读性为代价来考虑,而且如果不严格使用,修改视觉显示的 dom 属性似乎很快就会变得棘手。
【解决方案2】:

在查看了 BLSully 的回答和他提供的test page 之后,这里是实际的数字进行比较。

jQuery 类选择器性能 vs jQuery 数据属性选择器每秒操作数:

  • 在 Chrome 27.0.1453 中速度提高 31%
  • 在 Firefox 15.0.1 中速度提高了 140%
  • 在 Firefox 21.0 中速度提高了 131%
  • 在 IE 9.0 中速度提高了 1,267%
  • 在 IE 10.0 中速度提高了 1,356%

【讨论】:

    【解决方案3】:

    我的印象是,即使在移动浏览器中,选择器的性能现在也足够快。除非您真的打算大量使用选择器、数据属性或基于类的选择器(在这种情况下,我建议重新访问您的代码以尝试缓存已经查询的选择器)我们可以认为它们并没有那么糟糕。而且我什至会说,使用风格而不是其他风格并不引人注目。

    我认为浏览器供应商花费了更多时间来改进最常用的场景(查询类),而不是查询选择器。这种情况正在发生变化,如果他们也开始优化其他案例,我不会感到惊讶。

    【讨论】:

      【解决方案4】:

      我不知道所有这些答案,但我自己进行了测试,属性更快。

      您可以自己尝试,只需在开始时节省时间,完成任务并获得最后时间,然后进行数学运算

      		var newDate = new Date().getTime(); 
      		$('.test-t').removeClass('act');
      		$('.t1r').addClass('act');
      		var currentDate = new Date().getTime();
      		var diff = currentDate-newDate;
      		console.log(diff);
      
      		var newDate = new Date().getTime();
      		$('.test-t2').attr('this-act','');
      		$('.t2r').attr('this-act','1');
      		var currentDate = new Date().getTime();
      		var diff = currentDate-newDate;
      		console.log(diff);

      【讨论】:

      • 我不确定每个实例是否足以证明此案。由于我无法运行您的 sn-p,每种方法的时间有多大不同?
      • 也许现在,在提出问题几年后,浏览器有时间更新他们的查询引擎,数据属性的速度更快。指出这一点是好事。也许我们应该更新问题以符合今天的标准。
      • @SeaBass 不,我认为这不再是一个相关的问题。我认为时间的考验向我们证明,类和数据属性都有不同的用途。我对这个主题的兴趣现在不存在了,因为类名和数据属性现在可以通过 document.querySelector 获得,而且我从来没有真正查询过十几个项目来获得我正在寻找的东西(反应、角度等)。
      猜你喜欢
      • 2019-07-30
      • 2016-01-13
      • 2013-03-02
      • 1970-01-01
      • 2012-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-02
      相关资源
      最近更新 更多