【问题标题】:Why iterate by array with size faster为什么按大小更快地迭代数组
【发布时间】:2015-04-12 07:22:39
【问题描述】:

在第一个示例中,我创建了长度为 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

【问题讨论】:

    标签: javascript arrays performance v8 jsperf


    【解决方案1】:

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

    【讨论】:

    • 你的理论是如何解释jsperf.com/poerttest/6的?如果重新分配解释了性能差异,情况 3 不会比情况 2 快吗?你的理论是有道理的,我只是不确定它在 V8 中是否正确。
    • @dandavis 第二个和第三个例子是一样的,因为第三个例子的数组大小是2000。
    • 它不仅需要分配更多空间——它还需要在每次增长时复制内容。将O(n) 算法变成O(n^2) 算法
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-31
        • 2023-04-06
        • 2022-11-22
        • 1970-01-01
        • 2018-11-17
        • 1970-01-01
        相关资源
        最近更新 更多