代码之家  ›  专栏  ›  技术社区  ›  bugs

V8如何优化超大阵列的创建?

  •  4
  • bugs  · 技术社区  · 6 年前

    最近,我不得不对一项任务进行优化,这项任务涉及创建非常大的阵列(~10个元素)。

    few different methods ,并且,根据jsperf,以下选项似乎是最快的。

    var max = 10000000;
    var arr = new Array(max);
    for (let i = 0; i < max; i++) {
      arr[i] = true;
    }
    

    var max = 10000000;
    var arr = [];
    for (let i = 0; i < max; i++) {
      arr.push(true);
    }
    

    事实上,在我的实际应用程序中,第一个片段的速度也快得多。

    然而,我的理解是 V8 engine was able to perform optimised operations 关于数组 PACKED_SMI_ELEMENTS HOLEY_ELEMENTS .

    • 如果这是真的 new Array(n) 创建内部标记为的数组 ,(我相信这是真的)和
    • 如果这是真的 [] (我不太确定这是真的)

    为什么第一段比第二段快?

    我遇到的相关问题:

    1 回复  |  直到 6 年前
        1
  •  7
  •   jmrk    6 年前

    这里是V8开发者。第一个代码段速度更快,因为 new Array(max) 通知V8您希望阵列有多大,以便它可以立即分配适当大小的阵列;而在第二段中 [] .push()

    https://www.youtube.com/watch?v=m9cTaYI95Zc 这是一个很好的演示,但可能应该让它更清楚地说明打包元素和多孔元素之间的性能差异有多小,以及您应该担心的有多少。

    new Array(n) 把它预先分配到那个尺寸。当你 不要 提前知道最后它会有多大,然后从一个空数组开始(使用 [] new Array() new Array(0) ,无所谓)并根据需要种植(使用 a.push(...) a[a.length] = ...

    旁注:您的“for loop with new Array()and push”基准测试创建的数组是您想要的两倍大。