为什么按数组迭代速度更快
Why iterate by array with size faster
在第一个示例中,我创建了长度为 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);
在 Chrome 41.0.2272.118 OS X 10.10.3 和第一个块 运行 上进行测试更快。为什么?因为 JavaScript-engine 知道数组大小?
如果您不指定数组大小,它将不得不继续分配更多 space。但是如果你一开始就指定大小,它只会分配一次。
是的。当你分配大小时,解释器知道它只分配了 1000 个元素 memory/space。所以,当你插入元素时,只是一次操作。但是当你声明动态数组时,你的情况是第二种情况,解释器必须增加数组的大小然后推送元素。是2次操作!
另一种可能性是 push()
比分配到固定位置更昂贵。但测试表明并非如此。
实际情况是空数组的起始容量相对较小(哈希池或实际数组),增加该池的成本很高。您可以通过尝试使用较小的尺寸看到:在 100 个元素时,Array(100)
和 []
之间的性能差异消失。
在第一个示例中,我创建了长度为 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);
在 Chrome 41.0.2272.118 OS X 10.10.3 和第一个块 运行 上进行测试更快。为什么?因为 JavaScript-engine 知道数组大小?
如果您不指定数组大小,它将不得不继续分配更多 space。但是如果你一开始就指定大小,它只会分配一次。
是的。当你分配大小时,解释器知道它只分配了 1000 个元素 memory/space。所以,当你插入元素时,只是一次操作。但是当你声明动态数组时,你的情况是第二种情况,解释器必须增加数组的大小然后推送元素。是2次操作!
另一种可能性是 push()
比分配到固定位置更昂贵。但测试表明并非如此。
实际情况是空数组的起始容量相对较小(哈希池或实际数组),增加该池的成本很高。您可以通过尝试使用较小的尺寸看到:在 100 个元素时,Array(100)
和 []
之间的性能差异消失。