高级JavaScript数组连接 - 性能

时间:2016-05-21 19:02:51

标签: javascript arrays performance performance-testing

我正在尝试两种不同的方式来连接两个数组并使用巨大的数组来判断它们的性能,但我在第二个选项上遇到错误,我不明白为什么。

我首先用10,000,000个元素填充,其值等于它们的索引。

var arr1 = [];
var arr2 = [];
for (var i = 0; i < 10000000; i++) {
    arr1[i] = i;
} 
for (var i = 0; i < 10000000; i++) {
    arr2[i] = i;
}

然后:

选项1在~520ms内完成:

var newArr = arr1.concat(arr2);

选项2虽然会引发以下错误:

Array.prototype.push.apply(arr1, arr2);

错误:

/private/var/folders/j6/3fs5_k3n17z_0j2xrwj6sphw0000gn/T/CodeRunner/Untitled 9.js:12
Array.prototype.push.apply(arr1, arr2);
                     ^

RangeError: Maximum call stack size exceeded
    at Object.<anonymous> (/private/var/folders/j6/3fs5_k3n17z_0j2xrwj6sphw0000gn/T/CodeRunner/Untitled 9.js:12:22)
    at Module._compile (module.js:435:26)
    at Object.Module._extensions..js (module.js:442:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:311:12)
    at Function.Module.runMain (module.js:467:10)
    at startup (node.js:136:18)
    at node.js:963:3

修改

根据其中一条评论,我将选项2 更改为:

setTimeout(function () {
    Array.prototype.push.apply(arr1, arr2);
}, 0);

我还在接受:

/private/var/folders/j6/3fs5_k3n17z_0j2xrwj6sphw0000gn/T/CodeRunner/Untitled 9.js:16
    Array.prototype.push.apply(arr1, arr2);
                         ^

RangeError: Maximum call stack size exceeded
    at null._onTimeout (/private/var/folders/j6/3fs5_k3n17z_0j2xrwj6sphw0000gn/T/CodeRunner/Untitled 9.js:16:23)
    at Timer.listOnTimeout (timers.js:92:15)

1 个答案:

答案 0 :(得分:3)

apply()方法将提供的数组展开到参数列表。 ECMAScript规范本身对函数的参数数量没有限制,但大多数JS引擎都有实现特定的限制,因为它们为内部堆栈的每个函数调用使用固定或有限大小的结构以实现性能目的。虽然这个限制通常很高,但肯定远低于10000000个参数,这就是你得到错误的原因&#34;超出最大调用堆栈大小&#34;。