在阅读了the recent smashing magazine关于优化的文章之后,我运行了一些测试,看看从我的一个数组中间“删除”元素的最有效方法是什么。
在运行我自己的测试关于从数组中间拼接一个值并删除它/将其设置为null之后,我遇到了一个相当意外的结果,即从数组中拼接出值使数组达到一个数量级更快地遍历。
更多调查让我this。
出于某种原因,.shift()从数组中获取第一条记录使得遍历速度快300倍(在v8中看到的最大性能,但它似乎对我尝试过的所有浏览器都有效在)。
我怀疑我会滥用这个,因为我认为实际的遍历并不是瓶颈,但有谁知道为什么会出现这种情况?
编辑:错误使用jsPerf是这里的根本问题,请参阅下面的答案。
答案 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)