【问题标题】:Why is shift faster than index access in this JavaScript example?为什么在这个 JavaScript 示例中 shift 比索引访问快?
【发布时间】:2019-01-31 09:49:41
【问题描述】:
// 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

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

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

【问题讨论】:

  • 我不确定是否可以保证.shift 将是O(n)。它会在类似数组支持的列表中,但它可以很容易地成为链表中的O(1)
  • 仅供参考,I added a couple of cases 尝试控制forwhile 循环。以防万一,但似乎 shift 即使在 for 循环中执行,它的速度仍然更快。

标签: javascript arrays firefox v8 shift


【解决方案1】:

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

当您对改变数据结构的代码进行基准测试时,您需要在每次测试运行时重新创建数据结构。 I've fixed your jsperf.com case 和预期的 shift 更慢(请注意,很可能大部分执行时间都花在了createMatrix 上,所以实际上它慢了很多)。

【讨论】:

  • 感谢您的更正。我的错。我试图说明一个我见过的真实问题。我已经用 1000 x 1000 的数组更新了你的案例。移位仍然比索引快。 jsperf.com/shift-vs-index-access/8
  • @ran 这很奇怪,我无法解释。但是,当您稍微优化 createMatrix 时,shift 的运行速度会(相当)慢:jsperf.com/shift-vs-index-access/10
猜你喜欢
  • 1970-01-01
  • 2011-09-23
  • 1970-01-01
  • 2014-07-13
  • 2021-05-31
  • 2013-02-09
  • 2016-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多