JavaScript:为什么这个基准测试表明array.shift()读取数组值要比array[i]快得多?

7

只是一个快速的问题。我创建了基准测试(下面有链接),至少对我来说(运行chrome 18.0.1025),每次使用array.shift()从数组前面读取值似乎比使用while/for循环并通过索引访问值要快得多。

我确定这不可能是正确的,因为shift()需要做更多的工作,但与此同时,我看不出我可能犯了什么错误,以解释这种相当极端的差异?

http://jsperf.com/some-array-reading-comparisons

感谢阅读, 詹姆斯

1个回答

7
你只在每个测试中设置一次数组,因此只有第一个shift测试迭代有数据可用。接下来的迭代留下了第一个迭代中的空数组,并立即终止。 这里是已修复的测试套件,其中变异算法使用数据的副本。可预测地,shift算法在性能上最后执行。

1
为了公平起见,您需要为那些使用索引的人复制数组。 - kennytm
谢谢,那正是我最初的怀疑。我原本以为设置代码会在每次迭代之前运行,而不仅仅是在每个测试之前 :) - jsdw
我添加了一种版本的 shift 算法,它不使用 array.length 查找。现在,在 Chrome(v 39)中,shift 对我来说是最好的,见“shifting, no length lookup”: http://jsperf.com/some-array-reading-comparisons/14 - Lasse
看起来V8在这里针对所有“int”数组进行优化。使用由对象填充的数组进行的类似测试再次使“for”成为领导者 :-) 参见:http://jsperf.com/array-reverse-pop-versus-shift/2 - Lasse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接