Monday, May 20, 2024
 Popular · Latest · Hot · Upcoming
118
rated 0 times [  124] [ 6]  / answers: 1 / hits: 38172  / 13 Years ago, thu, june 23, 2011, 12:00:00

Basically, is



$(#someid)


or



$(.someclass)


faster than



$([someattr='value'])


I would imagine that it is (that is, selection by id is fastest, then class, then attribute), but does anyone know for sure?


More From » jquery

 Answers
196

ID is absolutely the fastest. Part of the reason is that ID is supposed to be unique, so the API stops searching after the ID is found in the DOM.



If you must use a class or attribute selector, you can improve performance by specifying the optional context parameter.



For example...



$(.someclass, #somecontainer)


Where somecontainer is something like a div, surrounding an element with class someclass. This can offer a huge performance benefit in the cases where somecontainer comprises a small fraction of the DOM.






UPDATE:



I did some tests a couple years ago around the context parameter. After reading the comments below I was curious if anything has changed. Indeed, it seems the scene has changed somewhat with today's browsers. Maybe it also has to do with improvements in jQuery? I don't know.



Here are my results with 10,000 iterations (code is below):



IE9



$(.someclass) - 2793 ms



$(.someclass, #somecontainer) - 1481 ms



Chrome 12



$(.someclass) - 75 ms



$(.someclass, #somecontainer) - 104 ms



Firefox 3.6



$(.someclass) - 308 ms



$(.someclass, #somecontainer) - 357 ms



So among these big 3 modern browsers, the context parameter only seems to help IE9. Older browsers will also benefit from the context parameter. But considering the prevalence of each of these browsers and averaging everything out, the net gain is somewhat of a wash now.



And here's the code in case anyone wants to try it themselves...



<html>
<head>
<script type=text/javascript src=http://code.jquery.com/jquery-1.6.1.min.js></script>
<script type=text/javascript>
$(document).ready(function(){

startTime = new Date().getTime();
for (i = 0; i < 10000; i++)
{
s = $(.someclass);
}
$(#withoutcontext).html(elapsedMilliseconds(startTime));


startTime = new Date().getTime();
for (i = 0; i < 10000; i++)
{
s = $(.someclass, #somecontainer);
}
$(#withcontext).html(elapsedMilliseconds(startTime));

});

function elapsedMilliseconds(startTime)
{
var n = new Date();
var s = n.getTime();
var diff = s - startTime;
return diff;
}
</script>
</head>
<body>
<h1>jQuery Selector Performance: Context vs No Context</h1>

<h2>$(.someclass)</h2>
<span id=withoutcontext>---</span> ms<br /><br />

<h2>$(.someclass, #somecontainer)</h2>
<span id=withcontext>---</span> ms<br /><br />

<hr />

<p class=a>a</p>
<p class=b>b</p>
<p class=c>c</p>
<p class=a>a</p>
<p class=b>b</p>
<p class=c>c</p>
<p class=a>a</p>
<p class=b>b</p>
<p class=c>c</p>
<p class=a>a</p>
<p class=b>b</p>
<p class=c>c</p>
<p class=a>a</p>
<p class=b>b</p>
<p class=c>c</p>
<div id=somecontainer>
<p class=a>a</p>
<p class=b>b</p>
<p class=c>c</p>
<p class=someclass>someclass</p>
</div>
<p class=a>a</p>
<p class=b>b</p>
<p class=c>c</p>
<p class=a>a</p>
<p class=b>b</p>
<p class=c>c</p>
<p class=a>a</p>
<p class=b>b</p>
<p class=c>c</p>
<p class=a>a</p>
<p class=b>b</p>
<p class=c>c</p>
<p class=a>a</p>
<p class=b>b</p>
<p class=c>c</p>
</body>
</html>

[#91531] Thursday, June 23, 2011, 13 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
neildrews

Total Points: 166
Total Questions: 103
Total Answers: 85

Location: Moldova
Member since Sat, Aug 6, 2022
2 Years ago
neildrews questions
Fri, Feb 18, 22, 00:00, 2 Years ago
Tue, Oct 12, 21, 00:00, 3 Years ago
Tue, Mar 23, 21, 00:00, 3 Years ago
Sun, Aug 16, 20, 00:00, 4 Years ago
;