为什么新阵列会变慢?

Ray*_*nos 3 javascript arrays profile benchmarking

比较操作时

var fat_cats = cats.slice()
Run Code Online (Sandbox Code Playgroud)

var fat_cats = new Array(cats.length)
Run Code Online (Sandbox Code Playgroud)

性能差异令人困惑.

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

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

任何解释都赞赏.

基准

Mah*_*dsi 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确实有类似的优化:结果.slice是a DenseCopiedArray或者DenseAllocatedArray,显然类似于V8稀疏数组.