在这个JavaScript示例中,为什么转换速度快于索引访问?

ran*_*ran 5 javascript arrays firefox v8 shift

// Shifting the array and accessing 0
let sum = 0;
while(matrix.length > 0) {
  sum += matrix[0][0];
  matrix.shift();
}
Run Code Online (Sandbox Code Playgroud)
// direct access
let sum = 0;
for (let i = 0; i < matrix.length; i++) {
  sum += matrix[i][0];
}
Run Code Online (Sandbox Code Playgroud)

https://jsperf.com/shift-vs-index-access

在上面的jsPerf链接的给定示例中,移动数组并访问0比直接访问更快.

这不是shift()一个O(n)操作?

Ber*_*rgi 6

不,它并不快.这只是你的基准被破坏了.该shift()操作清空了matrix数组,在第一次迭代后,您将比较空数组上的代码.

在对变更数据结构的代码进行基准测试时,需要在每次测试运行时重新创建数据结构.我已经修复了你的jsperf.com案例并且正如预期的那样shift慢(注意可能花费大部分执行时间createMatrix,所以事实上它很多).