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
The quickEach
method will pass a non-unique jQuery
instance to the callback meaning that there will be no need to instantiate a fresh jQuery
instance on each iteration. Most of the slow-down inherent in jQuery’s native iterator method (each
) is the constant need to have access to jQuery’s methods, and so most developers see constructing multiple instances as no issue… A better approach would be quickEach
.
My previous test case was bobbins - so we're back to James Padolsey's original quickEach - and the fact that in many scenarios it is about the same speed as a simple while loop.
Have added "Cowboy" Ben Alman's version for comparison.
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js">
</script>
<script>
var a = $('<div/>').append(Array(100).join('<a></a>')).find('a');
//Original version by James Padolsey.
//The try/catch and delete were designed to ensure no memory leak.
jQuery.fn.quickEach = (function() {
var jq = jQuery([1]);
return function(c) {
var i = -1,
el, len = this.length;
try {
while (++i < len && (el = jq[0] = this[i]) && c.call(jq, i, el) !== false);
} catch (e) {
delete jq[0];
throw e;
}
delete jq[0];
return this;
};
}());
/*!
* jQuery each2 - v0.2 - 8/02/2010
* http://benalman.com/projects/jquery-misc-plugins/
*
* Inspired by James Padolsey's quickEach
* http://gist.github.com/500145
*
* Copyright (c) 2010 "Cowboy" Ben Alman
* Dual licensed under the MIT and GPL licenses.
* http://benalman.com/about/license/
*/
(function($) {
// Create a placeholder jQuery object with a length of 1. The single item
// is completely arbitrary and will be replaced.
var jq = $([1]);
$.fn.each2 = function(fn) {
var i = -1;
while (
// Set both the first element AND context property of the placeholder
// jQuery object to the DOM element. When i has been incremented past the
// end, this[++i] will return undefined and abort the while loop.
(jq.context = jq[0] = this[++i])
// Invoke the callback function in the context of the DOM element,
// passing both the index and the placeholder jQuery object in. Like
// .each, if the callback returns `false`, abort the while loop.
&& fn.call(jq[0], i, jq) !== false) {}
// Return the initial jQuery object for chainability.
return this;
};
})(jQuery);
</script>
Ready to run.
Test | Ops/sec | |
---|---|---|
.each |
| ready |
Original .quickEach |
| ready |
original each2 |
| ready |
for loop 1 |
| ready |
for loop 2 |
| ready |
while loop |
| ready |
You can edit these tests or add more tests to this page by appending /edit to the URL.