principlejavascriptCritical
Fastest way to duplicate an array in JavaScript - slice vs. 'for' loop
Viewed 0 times
arraysliceforduplicatewayloopfastestjavascript
Problem
In order to duplicate an array in JavaScript: Which of the following is faster to use?
I know both ways do only a shallow copy: if
But this is not the point of this question.
I'm asking only about speed.
Slice methodvar dup_array = original_array.slice();For loopfor(var i = 0, len = original_array.length; i < len; ++i)
dup_array[i] = original_array[i];I know both ways do only a shallow copy: if
original_array contains references to objects, objects won't be cloned, but only the references will be copied, and therefore both arrays will have references to the same objects.But this is not the point of this question.
I'm asking only about speed.
Solution
There are at least 6 (!) ways to clone an array:
There has been a huuuge BENCHMARKS thread, providing following information:
-
for blink browsers
-
for other browsers
This remains true in Jul 2016.
Below are simple scripts that you can copy-paste into your browser's console and run several times to see the picture. They output milliseconds, lower is better.
while loop
slice
Please note that these methods will clone the Array object itself, array contents however are copied by reference and are not deep cloned.
- loop
slice
Array.from()
concat
- spread syntax (FASTEST)
- map
A.map(function(e){return e;});
There has been a huuuge BENCHMARKS thread, providing following information:
-
for blink browsers
slice() is the fastest method, concat() is a bit slower, and while loop is 2.4x slower.-
for other browsers
while loop is the fastest method, since those browsers don't have internal optimizations for slice and concat.This remains true in Jul 2016.
Below are simple scripts that you can copy-paste into your browser's console and run several times to see the picture. They output milliseconds, lower is better.
while loop
n = 1000*1000;
start = + new Date();
a = Array(n);
b = Array(n);
i = a.length;
while(i--) b[i] = a[i];
console.log(new Date() - start);slice
n = 1000*1000;
start = + new Date();
a = Array(n);
b = a.slice();
console.log(new Date() - start);Please note that these methods will clone the Array object itself, array contents however are copied by reference and are not deep cloned.
origAr == clonedArr //returns false
origAr[0] == clonedArr[0] //returns trueCode Snippets
n = 1000*1000;
start = + new Date();
a = Array(n);
b = Array(n);
i = a.length;
while(i--) b[i] = a[i];
console.log(new Date() - start);n = 1000*1000;
start = + new Date();
a = Array(n);
b = a.slice();
console.log(new Date() - start);origAr == clonedArr //returns false
origAr[0] == clonedArr[0] //returns trueContext
Stack Overflow Q#3978492, score: 924
Revisions (0)
No revisions yet.