JS: Array.reverse() vs. for and while loops (v42)

Revision 42 of this benchmark created by Rob on


Description

Checking performance of Array.reverse() vs custom loops.

See http://stackoverflow.com/questions/5276953/what-is-the-most-efficient-way-to-reverse-an-array-in-javascript.

Also see http://jsperf.com/forloop-vs-reverse-while-loop-and-array-reverse/9.

Preparation HTML

<script>
    var array = [{p:0}, {p:1}, {p:2}, {p:3}, {p:4}, {p:5}, {p:6}, {p:7}, {p:8}, {p:9}];
    var length = array.length;
</script>

Setup

array = [{p:0}, {p:1}, {p:2}, {p:3}, {p:4}, {p:5}, {p:6}, {p:7}, {p:8}, {p:9}]
    length = array.length

Test runner

Ready to run.

Testing in
TestOps/sec
Array.reverse()
array.reverse();
ready
while push then slice
var left = 0;
while (left < length)
{
    array.push(array[length - 1 - ++left]);
    array.splice(length - 1 - left, 1);
}
ready
while forward
var left = 0;
while (left < length)
{
    var right = length - 1 - left;
    array.push(array[right]);
    array.splice(right, 1);
    left += 1;
}
ready
for push then slice
for (length -= 2; length > -1; length -= 1)
{
    array.push(array[length]);
    array.splice(length, 1);
}
ready
for push
var result = [];
var i = null;
for (i = length - 1; i >= 0; i -= 1)
{
    result.push(array[i]);
}
ready
for swap
var left = null;
var right = null;
for (left = 0, right = length - 1; left < right; left += 1, right -= 1)
{
    var temporary = array[left];
    array[left] = array[right];
    array[right] = temporary;
}
ready
for swap half
var left = null;
var right = null;
for (left = 0; left < length / 2; left += 1)
{
    right = length - 1 - left;
    var temporary = array[left];
    array[left] = array[right];
    array[right] = temporary;
}
ready
IIFE
var i
for (i = 0; i < Math.floor(length / 2) - 1; i++)
{
  (function(right){
    array[length-1 - i] = array[i]
    array[i] = right
  })(array[length-1 - i])
}
ready
pop push
var newArray = [];
var temp;
while(undefined != (temp = array.pop())) {
    newArray.push(temp);
}
array = newArray;
ready

Revisions

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