为什么新阵列很慢
why is new Array slow?
当比较操作时
var fat_cats = cats.slice()
自
var fat_cats = new Array(cats.length)
性能差异令人困惑。
在 Firefox 和 chrome 中,new Array
速度较慢(当它应该更快时,它只是分配一个空数组而不是对其进行迭代(
在IE8中new Array
更快(这只是令人困惑(
任何解释都值得赞赏。
基准
通过查看 V8 数组函数的源代码来弄清楚。
如果数组有超过 1000 个元素并且调用了.slice
,则使用名为 SmartSlice
的函数,而不是其他情况下使用的SimpleSlice
函数。
SimpleSlice
实现为 for 循环复制(与数组复制测试用例中的代码完全相同(。 另一方面,SmartSlice
使用稀疏数组来表示数据。
在元素数量从 10,000 下降到 1000 以下的测试用例中,它们的性能完全相同(在误差范围内(,而在变化较少且元素超过 1000 个的更好控制的测试用例中,SmartSlice 方法比朴素副本快 ~36%。
虽然这完美地解释了 V8 方面的问题,但我不知道为什么 Firefox 在新数组上也比切片数组慢,即使在较小的尺寸下也是如此 - 除非它们有类似的优化(也许对于所有切片函数(。
编辑
这一直困扰着我,所以我下载了 Firefox 源代码并检查了 js/src/jsarray.cpp!array_slice
,Firefox 确实有类似的优化:.slice
的结果是DenseCopiedArray
或DenseAllocatedArray
,这显然类似于 V8 稀疏数组。
相关文章:
- 使用正则表达式捕获“”并分割成阵列
- AngularJS卡片转盘:将卡片返回到阵列的末尾
- 从不同的对象创建阵列
- 阵列中随机图像的问题
- 在特定条件下从存储在localStorage中的阵列中删除对象
- 如何将所有同级存储在动态本地存储阵列中
- 从localStorage添加和检索阵列
- angular.注射器阵列值未返回当前值
- 流星蒙戈的返回阵列
- 从2D RGB阵列创建图像
- 相对于角度控制器中的另一个阵列过滤阵列项目
- 复制阵列上的拼接会从父阵列/主阵列中删除对象
- 根据年龄值将对象阵列拆分为新阵列或对象
- 如何从此本地存储阵列中获取值以创建新的变量
- 将新阵列推送到 2D 数组中
- 为什么新阵列很慢
- 在日志记录中显示两个不同阵列的阵列
- 无法将阵列推入阵列(制作阵列阵列)
- 对于'新阵列'是'Don’不要做我期望的事
- 无法将新数据添加到基于交换机案例的阵列中