jsPerf.app is an online JavaScript performance benchmark test runner & jsperf.com mirror. It is a complete rewrite in homage to the once excellent jsperf.com now with hopefully a more modern & maintainable codebase.
jsperf.com URLs are mirrored at the same path, e.g:
https://jsperf.com/negative-modulo/2
Can be accessed at:
https://jsperf.app/negative-modulo/2
I want to see the performance difference between whole queries and segmented queries. Yes, split queries will return DOM elements in a different order because of query splitting.
<script>
var
selector1 = "div",
selector2 = "#find1",
selector3 = "#find1 span span",
selector4 = ".span1",
selector5 = "#find1 span span, #find1 b",
selector6 = ".span1, #find1 b span",
selector7 = ".span1, #find1 span span",
idSelectorRE = /^#([\w-]*)$/,
tagclassSelectorRE = /^(?:([\w]+)|([\w]+)?\.([\w\-]+))$/,
selectorGroupRE = /(([^,]*([\[].*?[\]]))|([^,].*?))+/g,
doc = window.document
function merge ( first, second ) {
var len = +second.length,
j = 0,
i = first.length
for ( ; j < len; j++ ) first[i++] = second[j]
first.length = i
return first
}
function qsa1 (selector) {
var match, node, ret, m, i, j
// ID
if (match = idSelectorRE.exec(selector)) {
return (node = doc.getElementById(match[1])) ? [node] : []
// Tag, Class, and Tag.Class
} else if (match = tagclassSelectorRE.exec(selector)) {
// Tag
if (m = match[1])
return merge([], doc.getElementsByTagName(m))
m = match[3];
// Class
if (!match[2])
return merge([], doc.getElementsByClassName(m))
// Tag.Class
return merge([], doc.querySelectorAll(selector))
// Multiple selectors / complex selectors
} else if (match = selector.match(selectorGroupRE)) {
ret = []
return merge(ret, doc.querySelectorAll(match[0]))
// All other selectors
} else {
return merge([], doc.querySelectorAll(selector))
}
}
function qsa2 (selector) {
var match, node, ret, m, i, j
// ID
if (match = idSelectorRE.exec(selector)) {
return (node = doc.getElementById(match[1])) ? [node] : []
// Tag, Class, and Tag.Class
} else if (match = tagclassSelectorRE.exec(selector)) {
// Tag
if (m = match[1])
return merge([], doc.getElementsByTagName(m))
m = match[3];
// Class
if (!match[2])
return merge([], doc.getElementsByClassName(m))
// Tag.Class
return merge([], doc.querySelectorAll(selector))
// Multiple selectors / complex selectors
} else if (match = selector.match(selectorGroupRE)) {
ret = []
if (match.length == 1) return merge(ret, doc.querySelectorAll(match[0]))
for (i = 0; node = match[i]; i++)
Array.prototype.push.apply(ret, qsa2(node))
return ret
// All other selectors
} else {
return merge([], doc.querySelectorAll(selector))
}
}
</script>
<div id="find1">
<b><span>1</span></b>
<span>2</span>
<span class="span1">3</span>
<span><span>4</span></span>
</div>
Ready to run.
Test | Ops/sec | |
---|---|---|
whole |
| ready |
split |
| ready |
You can edit these tests or add more tests to this page by appending /edit to the URL.