首页 > 解决方案 > 循环 JS Array 速度下降 16383 项

问题描述

在进行一些基准测试时,我注意到当您的数组长度为 16383 及以上时,与 <=16382 相比,循环通过它们的速度(使用 for 或 Array.map)显着下降。

我很好奇为什么会这样?为什么数组长度接近 2^14?

这是一些简单的基准测试:https : //jsperf.com/array-map-on-different-lengths 当你运行这个时,预期的结果是,速度会缓慢下降,但在 16382 和 16383 之间下降约 25% .

我已经用基准模块做了一些桌面测试,一些结果在这里: https ://docs.google.com/spreadsheets/d/1dSIKjap6D38dIj00adaFAVmmO1mWbRJwKrDCsSVODQA/edit?usp=sharing

16376 项的长度也有明显的下降。

只需创建不同长度的数组并循环它们:

const a = Array(16383).fill(1)
a.map(b => b)

这是否与堆有关,或者对 V8 进行了一些优化?

我真的很好奇。我会查看源代码,但甚至不知道从哪里开始。

解释(或如何称呼它)

观察到的行为不是由循环引起的,而是由某些长度的数组的分配引起的。按长度分配数组的速度

可以观察到一些“断点”。

标签: javascriptarraysnode.jsperformancev8

解决方案


推荐阅读