删除第一个元素后,数组遍历幅度更快

时间:2012-11-21 14:01:30

标签: javascript arrays optimization traversal

在阅读了the recent smashing magazine关于优化的文章之后,我运行了一些测试,看看从我的一个数组中间“删除”元素的最有效方法是什么。

在运行我自己的测试关于从数组中间拼接一个值并删除它/将其设置为null之后,我遇到了一个相当意外的结果,即从数组中拼接出值使数组达到一个数量级更快地遍历。

更多调查让我this

出于某种原因,.shift()从数组中获取第一条记录使得遍历速度快300倍(在v8中看到的最大性能,但它似乎对我尝试过的所有浏览器都有效在)。

我怀疑我会滥用这个,因为我认为实际的遍历并不是瓶颈,但有谁知道为什么会出现这种情况?

编辑:错误使用jsPerf是这里的根本问题,请参阅下面的答案。

3 个答案:

答案 0 :(得分:1)

性能测试充满了无数错误 最重要的是采用1000的样本长度。使用今天的处理器,可以立即遍历1000个项目阵列,并且您测量的第一个数组方法(shift,slice,...)所花费的时间比实际的数组遍历 所以你必须要 1)使用更长的阵列,
2)切片/移位/ ...在循环之前,因为那不是你想要测量的。

然后你会看到没有魔法,并且数组遍历对所有数组都采用同一时间

我从http://jsperf.com/spliced-vs-non-spliced/4开始,用于正常/切片(0,0)和shift()情况。性能差异不如测量误差。

答案 1 :(得分:0)

所以我尝试从每个函数中删除for循环,将核心数组函数与for循环本身进行比较。

http://jsperf.com/spliced-vs-non-spliced/3

由于每个功能内部工作的这些简单差异,基准测试正在按比例缩放。通过简化到最小的部分,我们能够隔离真正的差异。我怀疑基于这一点,for循环实际上是越快越慢 - 它只是出现了这种方式,因为测试中的其他功能。

尽管有误解,但仍然非常有助于阐明数组函数的工作方式以及JavaScript开发人员应该如何应用它们。

答案 2 :(得分:0)

好的,事实证明这实际上是我对jsPerf如何运作的误解。

脚本的设置部分是在每组循环开始时运行的,而不是每次尝试脚本时都运行它。

如图here所示,这些数字实际上就像你期望的那样。