3

比较操作时

var fat_cats = cats.slice()

var fat_cats = new Array(cats.length)

性能差异令人困惑。

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

在 IE8new Array中更快(这只是令人困惑)

任何解释表示赞赏。

基准

4

1 回答 1

8

通过查看V8 数组函数的源代码弄清楚了。

如果一个数组有超过 1000 个元素并被.slice调用,SmartSlice则使用一个被调用的函数,而SimpleSlice不是其他使用的函数。

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

在元素数量从 10,000 降至 1000 以下的测试用例中,它们的性能完全相同(在误差范围内),而在变化较少且元素超过 1000 个的更好控制的测试用例中,SmartSlice方法比原始副本快约 36%。


虽然这完美地解释了 V8 方面的问题,但我不知道为什么 Firefox 在新数组上的速度也比切片数组慢,即使在较小的尺寸下也是如此——除非它们有类似的优化(可能适用于所有切片函数)。

编辑

这一直困扰着我,所以我下载了 Firefox 源代码并签出js/src/jsarray.cpp!array_slice,Firefox 确实有类似的优化:结果.sliceDenseCopiedArrayor DenseAllocatedArray,这显然类似于 V8 稀疏数组。

于 2012-05-06T12:11:23.480 回答