如何在Javascript中预先分配密集数组?

如何在Javascript中预先分配密集数组?,javascript,arrays,performance,Javascript,Arrays,Performance,当使用新数组(size)ctor时,如果size不是一个常数,JS似乎会在某些浏览器(至少在Chrome中)中创建一个稀疏数组,导致访问速度比使用默认的ctor慢得多,如图所示 这与我想要的正好相反:我预先分配一个给定大小的数组,以避免错误,从而提高性能。有没有办法实现这个目标 请注意,这个问题不是关于新数组(大小)的模糊性。我在上面贴了一条建议。100000超过了预分配阈值1,99999仍在预分配,正如您所看到的,它要快得多 预分配与动态增长只是故事的一部分。对于 预分配阵列,100000恰

当使用
新数组(size)
ctor时,如果
size
不是一个常数,JS似乎会在某些浏览器(至少在Chrome中)中创建一个稀疏数组,导致访问速度比使用默认的ctor慢得多,如图所示

这与我想要的正好相反:我预先分配一个给定大小的数组,以避免错误,从而提高性能。有没有办法实现这个目标


请注意,这个问题不是关于
新数组(大小)
的模糊性。我在上面贴了一条建议。

100000超过了预分配阈值1,99999仍在预分配,正如您所看到的,它要快得多

预分配与动态增长只是故事的一部分。对于 预分配阵列,100000恰好是阈值,其中 V8决定为您提供一个慢速(也称为“字典模式”)数组

此外,按需增加阵列并不是每次都分配新阵列 添加了一个元素。取而代之的是,后备存储区成片增长 (目前,每次需要种植时,它都会以大约50%的速度增长, 但这是一种启发,可能会随着时间的推移而改变)


您可以找到更多信息…谢谢..:)

您的意思是,数组中不会有任何元素被推入或弹出?我没有提出任何矛盾的说法。我提供的链接解释了动态分配是如何将操作计数保持在O(1)的。正如Esailija在这里为您所做的那样,您必须将任何复制的措辞放在块引号中,以表明您没有编写此内容。我看到的任何不符合此规则的答案都将被删除。感谢您提供的信息。没有办法解决这个问题吗?在每个JS实例中不应该有一个简单的标志来覆盖该选项吗?否则,如果服务器发送的数据恰好超过了这个令人难以置信的任意数字,我就会遇到麻烦,大麻烦。@Domi这可能是应用程序代码的错误,它没有验证用户输入。阈值与V8垃圾收集器和堆的实现细节有关,因此没有办法使其更大。您介意为此发布一个官方链接吗?而且,你知道在未来的JS版本中如何解决这个问题吗?@Domi这不是关于Javascript,而是关于V8。语言中的Javascript数组并不意味着任何类型的分配,甚至不意味着它们是由数组支持的——事实上,如果您阅读了本文,那么显而易见的实现就是一个哈希表。最接近官方链接的是您可以阅读的源代码。