gpt4 book ai didi

javascript - 为什么新数组慢?

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:26:55 24 4
gpt4 key购买 nike

比较操作时

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com