为什么要按大小更快地迭代数组

时间:2015-04-12 07:22:39

标签: javascript arrays performance v8 jsperf

在第一个例子中,我创建了长度为1000的空数组:

var arr = new Array(1000);

for (var i = 0; i < arr.length; i++)
  arr[i] = i;

在第二个示例中创建了长度为0的空数组:

var arr = [];

for (var i = 0; i < 1000; i++)
  arr.push(i);

在OS X 10.10.3上的Chrome 41.0.2272.118中进行测试,第一个块运行得更快。为什么?因为JavaScript引擎知道数组大小吗?

基准在这里http://jsperf.com/poerttest/2

3 个答案:

答案 0 :(得分:6)

如果不指定数组大小,则必须继续分配更多空间。但是如果你在开头指定大小,它只分配一次。

答案 1 :(得分:0)

是。分配大小时,解释器知道它只分配了1000个元素内存/空间。因此,当您插入元素时,它只是一个操作。但是当你声明动态数组时,第二种情况是你的情况,解释器必须增加数组的大小然后推送元素。它是 2次操作

答案 2 :(得分:0)

另一种可能性是push()比分配到固定位置更昂贵。但测试表明情况并非如此。

会发生的是,空数组的起始容量相对较小(哈希池或实际数组),并且增加该池的成本很高。您可以通过尝试使用较小尺寸来查看:在100个元素下,Array(100)[]之间的效果差异消失。