for vs forEach

JavaScript performance comparison

Revision 37 of this test case created

Info

Is it faster to use the native forEach or just loop with for?

Inspired by Adrian Sutton's tests at: http://www.symphonious.net/2010/10/09/javascript-performance-for-vs-foreach/

This one adds random floating point numbers to see if the loop overhead is significant at all in the face of standard work.

Preparation code

<script src="//ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js">
</script>
<script>
Benchmark.prototype.setup = function() {
    var i,
        value,
        length,
        values = [],
        sum = 0,
        context = values;
   
   
    for (i = 0; i < 10000; i++) {
        values[i] = Math.random();
    }
   
    function add(val) {
        sum += val;
    }
};

Benchmark.prototype.teardown = function() {
    i = 0;
    value = 0;
    length = 0;
    values = [];
    sum = 0;
};
</script>

Test runner

Warning! For accurate results, please disable Firebug before running the tests. (Why?)

Java applet disabled.

Testing in unknown unknown
Test Ops/sec
forEach
values.forEach(add);
pending…
for loop, simple
for (i = 0; i < values.length; i++) {
    sum += values[i];
}
pending…
for loop, cached length
length = values.length;
for (i = 0; i < length; i++) {
    sum += values[i];
}
pending…
for loop, reverse
for (i = values.length - 1; i >= 0; i--) {
    sum += values[i];
}
pending…
for loop, cached length, callback
length = values.length;
for (i = 0; i < length; i++) {
    add(values[i], i, values);
}
pending…
for loop, cached length, callback.call
length = values.length;
for (i = 0; i < length; i++) {
    add.call(context, values[i], i, values);
}
pending…
$.each
$.each(values, function(key, value) {
    sum += value;
});
pending…
for ... in
for (i in values) {
    sum += values[i];
}
pending…
for loop, reverse, decrement condition
for (i = values.length; i--;) {
    sum += values[i];
}
pending…
for loop, reverse, pre-decrement
for (i = values.length - 1; i >= 0; --i) {
    sum += values[i];
}
pending…
for loop, assignment condition
for (i = 0; (value = values[i]) !== undefined; i++) {
    sum += value;
}
pending…
for loop, assignment condition, reversed
for (i = values.length - 1; (value = values[i]) !== undefined; i--) {
    sum += value;
}
pending…
for loop, assignment condition, callback
for (i = 0; (value = values[i]) !== undefined; i++) {
    add(value, i, values);
}
pending…
for loop, assignment condition, callback.call
for (i = 0; (value = values[i]) !== undefined; i++) {
    add.call(context, value, i, values);
}
pending…

Compare results of other browsers

Revisions

You can edit these tests or add even more tests to this page by appending /edit to the URL. Here’s a list of current revisions for this page:

3 comments

Bruce commented :

please change or add the "for in" test to:

var i; for (i in values) { sum += values[i]; }

without "var i", the browser has to look up variable "i" each time!

Matt Bower commented :

I call into the question the comparison here for forEach. With the forEach, you're running a function on each loop (not to mention you're running it like a reduce algorithm), whereas the most of the rest are simpler += operations. It's like comparing Fuji Apples to Gala Apples.

I would suggest to run add() (or some other simple function) for EVERY test case loop iteration.

Seb commented :

for in, browser saying its 95% slower, though all my tests are showing around 10% faster. A bug in your test?

Add a comment