为什么新阵列会变慢?

时间:2012-05-06 11:36:06

标签: javascript arrays benchmarking profile

比较操作时

var fat_cats = cats.slice()

var fat_cats = new Array(cats.length)

性能差异令人困惑。

在firefox和chrome new Array中速度较慢(当它应该更快时,它只是分配一个空数组而不是迭代它)

IE8中new Array的速度更快(这只是令人困惑)

任何解释都表示赞赏。

benchmark

1 个答案:

答案 0 :(得分:8)

通过查看the source code获取V8的数组函数来计算出来。

如果一个数组有超过1000个元素并且调用了.slice,则使用一个名为SmartSlice的函数,与另外使用的SimpleSlice函数相对应。

SimpleSlice实现为for循环复制(与数组复制测试用例中的代码完全相同)。另一方面,SmartSlice使用稀疏数组来表示数据。

a test case中,元素数量从10,000减少到1000以下,它们的性能完全相同(在误差范围内),而在a better-controlled test case中变异较少且超过1000元素,SmartSlice方法比原始副本快〜36%。


虽然这完全解释了V8的一面,但我不知道为什么Firefox在新阵列上的速度比切片阵列慢,即使尺寸较小 - 除非他们有适当的优化(可能适用于所有切片功能)。

修改

这让我感到烦恼,所以我下载了Firefox源代码并检出js/src/jsarray.cpp!array_slice,Firefox确实有类似的优化:.slice的结果是DenseCopiedArray或{{1这显然类似于V8稀疏数组。