【问题标题】:Whose performance among the following functions is better?以下功能中谁的性能更好?
【发布时间】:2016-04-25 21:41:40
【问题描述】:
function reverseArray(array) {
  var output = [];
  for (var i = array.length - 1; i >= 0; i--)
    output.push(array[i]);
  return output;
}

function reverseArrayInPlace(array) {
  for (var i = 0; i < Math.floor(array.length / 2); i++) {
    var old = array[i];
    array[i] = array[array.length - 1 - i];
    array[array.length - 1 - i] = old;
  }
  return array;
}

我在 chrome 浏览器上尝试了 performance.now(),但每次都得到不同的结果。另外,performance.now() 是检查代码性能的好方法吗?

【问题讨论】:

  • 看起来像是 jsperf 的工作
  • @Pointy jsperf 不可用。
  • 哦,好吧,我猜这将是一个相当大的问题 :)
  • 函数做不同的事情。一个从给定数组构造一个新数组而不改变现有数组,第二个函数操作现有数组。您不能互换使用它们。
  • 谁能回答为什么 performance.now() 在同一台机器和同一浏览器上给出不同的输出?

标签: javascript performance function


【解决方案1】:

你的第二个函数更快。

想一想循环需要“循环”多少次 - 在第二个函数中,您将循环减半,这样它的性能应该会更好。在第一个函数中,您一直循环遍历数组。

我们在这里谈论的是时间复杂度,其中有一些关于 SO 的很好的答案,特别是这个:How to find time complexity of an algorithm

【讨论】:

  • 你能回答为什么 performance.now() 在同一台机器相同的浏览器上给出不同的输出吗?
  • 有什么区别?你应该使用 jsperf...当它当然备份时
  • 第一个函数为 0.1250 毫秒,第二个函数为 0.2950 毫秒。另一个结果:第一个函数为 0.1850 毫秒,第二个函数为 0.1200 毫秒。
  • 确实有太多的因素可以发挥作用,无法给你一个明确的答案......对不起
【解决方案2】:

在第二个函数中,您正在应用所谓的循环展开。是一种提高性能的已知方法(在循环期间,加载到分段管道中的指令在循环完成迭代时被丢弃,因此必须再次加载它们)。

然而,这并不总是正确的(参见这篇文章Is GCC loop unrolling flag really effective?

您能做的最好的就是自己进行基准测试。

【讨论】:

  • 你能回答为什么 performance.now() 在同一台机器相同的浏览器上给出不同的输出吗?
  • @kamalkokne Google chrome 具有内置的性能测量工具。我建议改用那个developer.chrome.com/devtools/docs/cpu-profiling
猜你喜欢
  • 2020-06-08
  • 2021-08-27
  • 1970-01-01
  • 1970-01-01
  • 2021-06-16
  • 1970-01-01
  • 2021-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多