for vs while vs forEach (v360)

Revision 360 of this benchmark created by electron on


Description

The fastest syntax in for, forEach, and while.

Preparation HTML

<script>
var array = [],
    sum = 0,
    i = 0,
    length = 0;
array.length = 10000;
for (i = 0; i < array.length; i = (i + 1) | 0) {
  array[i] = i;
}

function toAdd(val) { sum += val; }
</script>

Test runner

Ready to run.

Testing in
TestOps/sec
forEach, +=
array.forEach(function(v) {
  sum += v;
});
ready
forEach, sum + v
array.forEach(function(v) {
  sum = sum + v;
});
ready
forEach, recognize integer
array.forEach(function(v) {
  sum = (sum + v) | 0;
});
ready
for, no cache, increament is behind.
for (i = 0; i < array.length; i++) {
  sum += array[i];
}
ready
while, no cache, increament is behind.
while (i < array.length) {
  sum += array[i];
  i++;
}
ready
for, no cache, prelude increament
for (i = 0; i < array.length; ++i) {
  sum += array[i];
}
ready
while, no cache, prelude increament
while (i < array.length) {
  sum += array[i];
  ++i;
}
ready
while, no cache, prelude increament, use function.
while (i < array.length) {
  toAdd(array[i]);
  ++i;
}
ready
while, no cache, prelude increament, use function.call.
while (i < array.length) {
  toAdd.call(array[i]);
  ++i;
}
ready
while, no cache, prelude increament, recognize integer.
while (i < array.length) {
  sum = (sum + array[i]) | 0;
  i = (i + 1) | 0;
}
ready
while, no cache, prelude increament, recognize integer 2.
while (i < array.length) {
  sum += array[i];
  i = (i + 1) | 0;
}
ready
while, no cache, prelude increament, recognize integer 3.
while (i < array.length) {
  sum = (sum + array[i]) | 0;
  ++i;
}
ready
for, no cache, recognize integer.
for (i = 0; i < array.length; i = (i + 1) | 0) {
  sum = (sum + array[i]) | 0;
}
ready
for, cache, decrement is behind.
for (i = array.length - 1; 0 <= i; i--) {
  sum += array[i];
}
ready
while, cache, decrement is behind.
i = array.length - 1;
while (0 <= i) {
  sum += array[i];
  i--;
}
ready
for, prelude decrement
for (i = array.length - 1; 0 <= i; --i) {
  sum += array[i];
}
ready
while, prelude decrement
i = array.length - 1;
while (0 <= i) {
  sum += array[i];
  --i;
}
ready
for, cache length, increment is behind.
length = array.length;
for (i = 0; i < length; i++) {
  sum += array[i];
}
ready
while, cache length, increment is behind.
length = array.length;
while(i < length) {
  sum += array[i];
  i++;
}
ready
while, cache length, increment is behind, recognize integer.
length = array.length;
while(i < length) {
  sum = (sum + array[i]) | 0;
  i = (i + 1) | 0;
}
ready
Duff's device
// credit: Jeff Greenberg
var iterations = Math.floor(array.length / 8),
    startAt    = array.length % 8,
    i          = 0;

do {
    switch (startAt) {
        case 0: toAdd(array[i++]);
        case 7: toAdd(array[i++]);
        case 6: toAdd(array[i++]);
        case 5: toAdd(array[i++]);
        case 4: toAdd(array[i++]);
        case 3: toAdd(array[i++]);
        case 2: toAdd(array[i++]);
        case 1: toAdd(array[i++]);
    }
    startAt = 0;
} while (iterations--);
ready

Revisions

You can edit these tests or add more tests to this page by appending /edit to the URL.