提高jQueryselect器性能的好方法?
我正在寻找任何方式来提高jQuery调用的select器性能。 具体来说就是这样的:
$("div.myclass")
比$(".myclass")
更快
我认为这可能是,但我不知道如果jQuery是足够聪明的限制search标签名称第一等任何人有任何想法如何制定一个jQueryselect器string的最佳性能?
毫无疑问, 首先通过标记名进行过滤要比通过类名进行过滤快得多 。
直到所有浏览器本地实现getElementsByClassName为止,情况就是如此,getElementsByTagName就是这种情况。
在某些情况下,可以通过限制其上下文来加速查询。 如果您有元素引用,则可以将其作为第二个parameter passing,以限制查询的范围:
$(".myclass", a_DOM_element);
应该快于
$(".myclass");
如果你已经有了a_DOM_element,并且它比整个文档要小的多。
正如里德所述,jQuery正在从下往上工作。 虽然
这意味着
$('#foo bar div')
比$('bar div #foo')
慢很多
那不是重点。 如果你有#foo
你不会在select器中放任何东西,因为ID必须是唯一的。
重点是:
- 如果你从一个带有ID的元素中select了任何东西,那么先select后面的元素,然后使用
.find
,.find
等。$('#foo').find('div')
- 你最左边的(第一个)select器的一部分可能效率不高,最右边的(最后一个)部分应该是最有效率的 – 也就是说,如果你没有ID,确保你正在寻找
$('div.common[slow*=Search] input.rare')
而不是$('div.rare input.common[name*=slowSearch]')
– 因为这并不总是适用的确保通过相应的分割强制select器顺序。
为了完全理解什么是更快的,你必须了解CSSparsing器是如何工作的。
您传入的select器使用RegExp分割成可识别的部分,然后逐个处理。
一些select器如ID和TagName,使用浏览器的本地实现更快。 而其他类如类和属性分别编程,因此慢得多,需要遍历选定的元素,并检查每个类的名称。
所以是的回答你的问题:
$('tag.class')比$('。class')快。 为什么? 在第一种情况下,jQuery使用本地浏览器实现将select过滤到您所需的元素。 只有这样,才会启动较慢的.class实现过滤,直到您所要求的为止。
在第二种情况下,jQuery使用它的方法通过抓取类来过滤每个元素。
这比jQuery更进一步,因为所有的JavaScript库都基于这个。 唯一的其他select是使用xPath,但目前在所有浏览器中都不是很好支持。
这里是如何增加你的jQueryselect器的性能:
- 尽可能用#idselect( 性能testing结果 〜250更快)
- 指定select范围(
$('.select', this)
)
我会添加一个注意事项,在99%的Web应用程序中,即使是Ajax重度应用程序,Web服务器的连接速度和响应也会驱动应用程序的性能,而不是JavaScript。 我并不是说你应该写有意识的慢代码,或者一般意识到哪些事情可能比其他事情更快。
但是我想知道如果你试图解决一个还没有真正存在的问题,或者即使你正在优化一些可能在不久的将来会改变的东西(比如说,如果有更多的人开始使用支持getElementsByClassName()
的浏览器getElementsByClassName()
函数),使你优化的代码实际上运行得更慢。
另一个查找performance信息的地方是Hugo Vidal Teixeira对select器页面的性能分析。
http://www.componenthouse.com/article-19
这给了select器的id,select器类和select器前缀标签名称的速度很好。
id最快的select器是:$(“#id”)
按类最快的select器是:$('tag.class')
所以按标签前缀只有在按类select时才有帮助!
我已经在一些jQuery邮件列表中,从我读到的那里,他们很可能通过标签名称然后类名称(如果更快,反之亦然)过滤。 他们对速度十分迷恋,并会用任何方式来获得表演的乐趣。
无论如何,我真的不会太担心,除非你运行这个select器数千次/秒。
如果你真的担心,试着做一些基准testing,看看哪个更快。
考虑使用Oliver Steele的顺序库来随时调用方法,而不是一次调用方法。
http://osteele.com/sources/javascript/sequentially/
“最终”方法可以帮助您在最初调用一定时间后调用方法。 “顺序”方法允许您在一段时间内排列几个任务。
很有帮助!
从我问的一个问题的一个伟大的提示 :尽可能使用标准的CSSselect器 。 这允许jQuery使用select器API 。 根据John Resig所做的testing ,这会导致select器的性能接近本机。 函数如:has()
和:contains()
应该被避免。
从我的研究支持的select器API引入了jQuery 1.2.7,Firefox 3.1,IE 8,Opera 10,Safari 3.1。
如果我没有弄错,jQuery也是一个自下而上的引擎。 这意味着$('#foo bar div')
比$('bar div #foo')
慢很多。 例如, $('#foo a')
将遍历页面上的所有元素,看看它们是否具有#foo
的祖先,这使得这个select器非常低效。
Resig可能已经针对这种情况进行了优化(如果他这么做,我不会感到惊讶 – 我相信他是在他的Sizzle引擎中做的,但是我不是100%肯定的)。
我相信,通过IDselect第一个总是更快:
$("#myform th").css("color","red");
应该快于
$("th").css("color","red");
但是,我不知道有多less链接帮助开始使用ID? 这是
$("#myform").find("th").css("color","red") .end().find("td").css("color","blue");
比这更快吗?
$("#myform th").css("color","red"); $("#myform td").css("color","blue");