javascript - 为什么新数组慢?

标签 javascript arrays benchmarking profile

比较操作时

var fat_cats = cats.slice()

var fat_cats = new Array(cats.length)

性能差异令人困惑。

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

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

任何解释表示赞赏。

benchmark

最佳答案

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

关于javascript - 为什么新数组慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10470202/

相关文章:

benchmarking - 使用 pycassa 进行压力测试

javascript - React.js风格变异错误……?

javascript - 按迭代对象内数组长度的 Angular 重复顺序

c++ - 在C++中使用变量而不是 `#define`指定数组大小是否不好? (C错误: variably modified at file scope) [closed]

python - 如何搜索数组列表

ios - 如何访问数组中的随机索引

benchmarking - 与wrk一起发布请求?

javascript - 从表中删除行

javascript - 如何将变量设置为等于子元素中属性的值?

performance - 有人可以建议我如何测试或基准测试 apache Storm 吗?