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中更快(这只是令人困惑)
任何解释都赞赏.
通过查看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稀疏数组.
| 归档时间: |
|
| 查看次数: |
717 次 |
| 最近记录: |