为什么在JavaScript示例中,使用shift比索引访问更快?

5
// Shifting the array and accessing 0
let sum = 0;
while(matrix.length > 0) {
  sum += matrix[0][0];
  matrix.shift();
}

// direct access
let sum = 0;
for (let i = 0; i < matrix.length; i++) {
  sum += matrix[i][0];
}

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

在上述 jsPerf 链接中的示例中,移位数组并访问 0 比直接访问更快。

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


我不确定.shift操作一定是O(n)的。在类似于基于数组的列表中,它可能是O(n)的,但在链表中很容易就能做到O(1) - VLAZ
仅供参考,我添加了一些案例来尝试控制forwhile循环。以防万一这会有所不同,但似乎即使在for循环中执行,shift的速度也比相同的边距更快。 - VLAZ
1个回答

7
不,它并不更快。这只是因为你的基准测试出现了问题。而 shift() 操作会清空 matrix 数组,在第一次迭代后,你是在比较一个空数组上的代码。
当你在对改变数据结构的代码进行基准测试时,你需要在每次测试运行时重新创建数据结构。我已经修复了您的 jsperf.com 示例,如预期的那样,shift 更慢(请注意,可能大部分执行时间都花费在 createMatrix 上,实际上慢了很多)。

1
谢谢您的纠正,是我的错误。我试图说明一个我见过的真实问题。 我已经更新了您的案例,使用了1000 x 1000的数组。移位仍然比索引更快。https://jsperf.com/shift-vs-index-access/8 - ran
1
@ran 这很奇怪,我无法解释。不过,当你稍微优化一下 createMatrix,然后运行 shift 的速度会变得(相当)慢:https://jsperf.com/shift-vs-index-access/10 - Bergi

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