为什么新阵列很慢

why is new Array slow?

本文关键字:阵列 新阵列 为什么      更新时间:2023-09-26

当比较操作时

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的结果是DenseCopiedArrayDenseAllocatedArray,这显然类似于 V8 稀疏数组。