javascript - 循环 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 进行了一些优化?
我真的很好奇。我会查看源代码,但甚至不知道从哪里开始。
解释(或如何称呼它)
观察到的行为不是由循环引起的,而是由某些长度的数组的分配引起的。
可以观察到一些“断点”。
- 在 Array( 16 ) 周围,16 比 17 快得多。
- Array( 1024 )发生了一些奇怪的事情,比之前和之后要快一点
- 以及已经提到的 Array( 16383 )
解决方案
推荐阅读
- ios - 构建 Ionic 应用程序时出现依赖错误
- r - 在 Factoextra 上更改形状
- javascript - DOM 外的过渡
- python - 带有高速公路 python 的 websocket 中继
- css - 如何在 FontAwesome 中包含我的自定义字体
- python - 从 YouTube 视频中提取音频
- apache-spark - 如何在不使用 Azure Databricks 中的 Pyspark 缓存数据的情况下查询损坏的记录?
- airflow - 如何在 python 可调用文件中使用 postgres 连接 ID 连接到 postgres
- django-rest-auth - Django rest auth :: smtp.EmailBackend:如果在注册期间连接到 smtp 失败而不是在调试模式下至少 500 失败,如何获取一些消息
- r - 特殊字符在 renderUI 中不起作用