Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/448.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript V8如何优化超大阵列的创建?_Javascript_Arrays_Performance_V8 - Fatal编程技术网

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

Javascript V8如何优化超大阵列的创建?,javascript,arrays,performance,v8,Javascript,Arrays,Performance,V8,最近,我不得不对一项任务进行优化,这项任务涉及创建非常大的阵列(~10个阵列)⁸ 元素) 我测试了一个,根据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(设i=0;i

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

我测试了一个,根据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(设i=0;i
比之前快了约85%

var max = 10000000;
var arr = [];
for (let i = 0; i < max; i++) {
  arr.push(true);
}
var max=10000000;
var-arr=[];
for(设i=0;i
事实上,在我的实际应用程序中,第一个片段的速度也快得多

然而,我的理解是,与
HOLEY\u元素数组
相反,带有
PACKED\u SMI\u元素的on数组是一种类型

因此,我的问题如下:

  • 如果
    newarray(n)
    确实创建了一个内部标记有
    HOLEY\u元素的数组(我相信这是真的),并且
  • 如果
    []
    确实创建了一个内部标记有
    压缩的SMI\u元素的数组(我不太确定这是真的)
为什么第一个代码段比第二个快?

我遇到的相关问题:


这里是V8开发者。第一个代码段速度更快,因为
newarray(max)
通知V8您希望数组有多大,因此它可以立即分配一个大小合适的数组;而在带有
[]
/
.push()
的第二个代码段中,数组从零容量开始,必须增长几倍,包括将其现有元素复制到新的备份存储

这是一个很好的演示,但可能应该让它更清楚地说明打包元素和多孔元素之间的性能差异有多小,以及您应该担心的有多少

简言之:只要您知道需要一个数组有多大,就可以使用
newarray(n)
将其预先分配到该大小。如果您事先不知道最终会有多大,那么就从一个空数组开始(使用
[]
新数组()
新数组(0)
,无所谓)并根据需要进行增长(使用
a.push(…)
a[a.length]=…
,无所谓)


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

IIRC packed与holey的性能差异并不大,它只是一个内部标记,需要对数组进行不同的处理(特别是考虑到自那次谈话以来V8中发生了许多变化)。此外,应该在使用数组时观察性能差异,而不是在创建和初始化数组时。你到底对整个应用程序做了什么基准测试,还是只对你发布的两个片段进行了基准测试?@Bergi谢谢,你有关于这个的文档链接吗?在基准测试方面,我测量了一个函数的性能,该函数涉及数组的创建和使用(后者在两种情况下都是相同的)。我找到了@jmrk的答案之一的链接:(参见注释,了解holey vs packed的讨论)。不确定这个问题是否值得重复。直接从V8开发人员那里得到答案非常好,感谢您的澄清。关于这一切,有什么文章/文档我可以看一下吗?感谢您指出jsperf中的错误,这是我的小疏忽side@bugs:上的博客和文档包含大量信息,然后在YouTube上有各种技术演示的视频,其中至少有一个您已经找到;-)@vsemozhetbyt:正确,这是一个相关的特性请求;它的优先级很低,因为对于大多数实际代码来说,区别并不重要。@jmrk
newarray(n)
也会使数组处于HOLEY模式。这难道不被视为坏习惯吗?@snek:使用
新数组(n)
非常好,这不是一个坏习惯。HOLEY模式没什么好担心的(见我答案的第二段)。将其视为“对于好奇的人来说,这里是V8引擎在引擎盖下执行的许多技巧中的一个,它可以尽可能地从您抛出的任何代码中挤出性能”。不要认为这是你必须意识到和避免的事情。