Javascript:为什么这个基准测试显示array.shift()在读取数组中的值时比array[i]快得多?
一个简单的问题。我创建了基准测试(下面的链接),至少对我来说(运行chrome 18.0.1025),每次使用array.shift()从数组前端读取值似乎比使用while/for循环读取值并通过索引访问值要快得多 我确信这不可能是对的,因为shift()还有很多工作要做,但同时我也看不出有什么地方我会做错来解释这个极端的差异 谢谢你的阅读,Javascript:为什么这个基准测试显示array.shift()在读取数组中的值时比array[i]快得多?,javascript,arrays,shift,Javascript,Arrays,Shift,一个简单的问题。我创建了基准测试(下面的链接),至少对我来说(运行chrome 18.0.1025),每次使用array.shift()从数组前端读取值似乎比使用while/for循环读取值并通过索引访问值要快得多 我确信这不可能是对的,因为shift()还有很多工作要做,但同时我也看不出有什么地方我会做错来解释这个极端的差异 谢谢你的阅读, James每次测试只设置一次数组,因此只有shift测试的第一次迭代有任何数据可以使用。下一次迭代的第一次迭代留下一个空数组,并立即终止 ,其中变异算法
James每次测试只设置一次数组,因此只有
shift
测试的第一次迭代有任何数据可以使用。下一次迭代的第一次迭代留下一个空数组,并立即终止
,其中变异算法处理数据的副本。
shift
算法在性能上可以预见地排在最后。为了公平起见,您也需要为使用索引的用户复制数组。谢谢,这是我最初的怀疑。我的印象是,设置代码是在每次迭代之前运行的,而不是在每次测试之前:)我添加了一个版本的shift算法,它不使用array.length
lookup。现在,在chrome(V39)中,shift对我来说是第一位的,请参阅“shift,no-length lookup”:看起来V8在这里对allint
数组进行了优化。使用填充有对象的数组进行的类似测试使的再次成为前导:-)请参见: