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
<div style="position:relative;padding:20px;margin-top:12px">
<div style="position:relative;padding:40px;margin-top:12px">
<table><tbody><tr><td><div id="mydiv">
test
<div>
</div>
</div></td></tr></tbody></table>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js">
</script>
var mydiv = document.getElementById('mydiv')
var $mydiv = $(mydiv);
function boundOffset(elem) {
var box = elem.getBoundingClientRect();
return {
top: box.top + (window.pageYOffset || document.documentElement.scrollTop) - (document.documentElement.clientTop || 0),
left: box.left + (window.pageXOffset || document.documentElement.scrollLeft) - (document.documentElement.clientLeft || 0)
};
}
var loopedOffset = function(elem) {
var offsetLeft = elem.offsetLeft,
offsetTop = elem.offsetTop;
while (elem = elem.offsetParent) {
offsetLeft += elem.offsetLeft;
offsetTop += elem.offsetTop;
}
return {
left: offsetLeft,
top: offsetTop
};
};
var loopedOffsetWithFixedCheck = function(elem) {
var offsetLeft = elem.offsetLeft,
offsetTop = elem.offsetTop;
while (elem = elem.offsetParent) {
offsetLeft += elem.offsetLeft;
offsetTop += elem.offsetTop;
if (elem.style.position === 'fixed') {
offsetLeft += window.pageXOffset || document.documentElement.scrollLeft;
offsetTop += window.pageYOffset || document.documentElement.scrollTop;
}
}
return {
left: offsetLeft,
top: offsetTop
};
}
var loopedOffsetOptimized = function(elem) {
var offsetLeft = elem.offsetLeft,
offsetTop = elem.offsetTop,
lastElem = elem;
while (elem = elem.offsetParent) {
offsetLeft += elem.offsetLeft;
offsetTop += elem.offsetTop;
lastElem = elem;
}
if (lastElem && lastElem.style.position === 'fixed') {
offsetLeft += window.pageXOffset || document.documentElement.scrollLeft;
offsetTop += window.pageYOffset || document.documentElement.scrollTop;
}
return {
left: offsetLeft,
top: offsetTop
};
};
var loopedOffsetOptimized2 = function (elem) {
var offsetLeft = elem.offsetLeft
, offsetTop = elem.offsetTop
, lastElem = elem;
while (elem = elem.offsetParent) {
if (elem === document.body) { //from my observation, document.body always has scrollLeft/scrollTop == 0
break;
}
offsetLeft += elem.offsetLeft;
offsetTop += elem.offsetTop;
lastElem = elem;
}
if (lastElem && lastElem.style.position === 'fixed') { //slow - http://jsperf.com/offset-vs-getboundingclientrect/6
//if(lastElem !== document.body) { //faster but does gives false positive in Firefox
offsetLeft += window.pageXOffset || document.documentElement.scrollLeft;
offsetTop += window.pageYOffset || document.documentElement.scrollTop;
}
return {
left: offsetLeft,
top: offsetTop
};
};
var body = document.body;
var loopedOffsetOptimized3 = function (elem) {
var offsetLeft = elem.offsetLeft
, offsetTop = elem.offsetTop
, lastElem = elem;
while (elem = elem.offsetParent) {
if (elem === body) { //from my observation, document.body always has scrollLeft/scrollTop == 0
break;
}
offsetLeft += elem.offsetLeft;
offsetTop += elem.offsetTop;
lastElem = elem;
}
if (lastElem && lastElem.style.position === 'fixed') { //slow - http://jsperf.com/offset-vs-getboundingclientrect/6
//if(lastElem !== document.body) { //faster but does gives false positive in Firefox
offsetLeft += window.pageXOffset || document.documentElement.scrollLeft;
offsetTop += window.pageYOffset || document.documentElement.scrollTop;
}
return {
left: offsetLeft,
top: offsetTop
};
};
Ready to run.
Test | Ops/sec | |
---|---|---|
loopedOffset |
| ready |
$.offset |
| ready |
boundOffset |
| ready |
loopedOffsetWithFixedCheck |
| ready |
loopedOffsetOptimized |
| ready |
loopedOffsetOptimized2 |
| ready |
loopedOffsetOptimized3 |
| ready |
You can edit these tests or add more tests to this page by appending /edit to the URL.