【发布时间】:2019-02-01 14:54:38
【问题描述】:
最近,我不得不优化一项涉及创建非常大的数组(约 10⁸ 个元素)的任务。
我测试了few different methods,根据 jsperf,以下选项似乎是最快的。
var max = 10000000;
var arr = new Array(max);
for (let i = 0; i < max; i++) {
arr[i] = true;
}
这比 85% 快
var max = 10000000;
var arr = [];
for (let i = 0; i < max; i++) {
arr.push(true);
}
确实,第一个 sn-p 在我的实际应用中也快得多。
但是,我的理解是带有PACKED_SMI_ELEMENTS 元素的数组上的V8 engine was able to perform optimised operations 类型,而不是HOLEY_ELEMENTS 的数组。
所以我的问题如下:
- 如果
new Array(n)确实创建了一个内部标有HOLEY_ELEMENTS的数组(我相信这是真的)并且 - 如果
[]确实创建了一个内部标记为PACKED_SMI_ELEMENTS的数组(我不太确定是不是真的)
为什么第一个 sn-p 比第二个快?
我遇到过的相关问题:
【问题讨论】:
-
IIRC 打包与孔洞并没有太大的性能差异,它只是一个内部标记,需要对数组进行不同处理(特别是考虑到自那次谈话以来 V8 中发生了许多变化)。此外,应该在 使用 数组时观察性能差异,而不是在创建和初始化它时。您究竟对什么进行了基准测试,您的整个应用程序还是仅您发布的两个 sn-ps?
-
@Bergi 谢谢,你有关于这方面的一些文档的链接吗?在基准方面,我测量了一个函数的性能,该函数涉及数组的创建和使用(后者在两种情况下都是相同的)
-
我找到了@jmrk 的答案之一的链接:stackoverflow.com/a/53161007/1048572(请参阅 cmets 以了解空洞与打包的讨论)。不确定该问题是否值得重复。
标签: javascript arrays performance v8