比较操作时
var fat_cats = cats.slice()
到
var fat_cats = new Array(cats.length)
性能差异令人困惑。
在 firefox 和 chromenew Array
中速度较慢(当它应该更快时,它只是分配一个空数组而不是对其进行迭代)
在 IE8new Array
中更快(这只是令人困惑)
任何解释表示赞赏。
比较操作时
var fat_cats = cats.slice()
到
var fat_cats = new Array(cats.length)
性能差异令人困惑。
在 firefox 和 chromenew Array
中速度较慢(当它应该更快时,它只是分配一个空数组而不是对其进行迭代)
在 IE8new 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
or DenseAllocatedArray
,这显然类似于 V8 稀疏数组。