比较操作时
var fat_cats = cats.slice()
到
var fat_cats = new Array(cats.length)
性能差异令人困惑。
在 firefox 和 chrome 中 new Array
比较慢(当它应该更快时,它只是分配一个空数组而不是对其进行迭代)
在 IE8 中,new Array
速度更快(这只是令人困惑)
任何解释表示赞赏。
最佳答案
通过查看 the source code 弄明白了用于 V8 的数组函数。
如果一个数组有超过 1000 个元素并且 .slice
被调用,一个叫做 SmartSlice
的函数被使用,相对于 SimpleSlice
函数被使用否则。
SimpleSlice
实现为 for 循环复制(与数组复制测试用例中的代码完全相同)。另一方面,SmartSlice
使用稀疏数组来表示数据。
在a test case其中元素数量从 10,000 下降到 1000 以下,它们的性能完全相同(在误差范围内),而在 a better-controlled test case 中SmartSlice 方法具有更少的变化和超过 1000 个元素,比原始副本快约 36%。
虽然这完美地解释了 V8 方面的事情,但我不知道为什么 Firefox 在新数组上也比切片数组慢,即使是在更小的尺寸上——除非它们有类似的优化(可能对所有切片函数)。
编辑
这一直困扰着我,所以我下载了 Firefox 源并查看了 js/src/jsarray.cpp!array_slice
,Firefox 确实有类似的优化:.slice 的结果
是一个DenseCopiedArray
或DenseAllocatedArray
,这显然类似于V8 稀疏数组。
关于javascript - 为什么新数组慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10470202/