【问题标题】:Does extracting functions incur performance penalties?提取函数会导致性能损失吗?
【发布时间】:2012-07-06 17:52:49
【问题描述】:

我正在遍历一个大数组(10^5 项)并对每个数组执行操作。

for (var row in rows) {
  switch (operator) {
    case "op1":
      row += 1;
      break;
    case "op2":
      ...
    case "opN":
      break;
  }
}

为了可测试性和可读性,我想将内部 switch 语句提取到它自己的函数中,所以循环看起来像

for (var row in rows) {
  this.updateRow(row, operator);
}

与调用函数 10^5 次相关的开销是否会导致明显的性能损失?

【问题讨论】:

  • 你可以在jsperf.com做你自己的测试
  • 很可能,是的。但只要测试一下……做测试并不难。
  • 如果您对性能感兴趣,最好尽可能将操作员测试完全拉出循环。 (您的示例代码未显示循环中的“运算符”更改。)
  • 我没想到会有很大的不同。然而,由于你的函数是一个方法,一个简单的优化是在一个局部变量中创建一个对它的引用,因为这些对于 JS 来说比对象方法解析得更快。

标签: javascript optimization readability


【解决方案1】:

内联函数总是比定义函数快一点。这是因为参数和返回之类的东西不需要在运行时从堆栈中推送和弹出。通常这对于较新的机器来说不是什么大问题,但是通过 10^5 次函数调用,您可能会看到一些性能下降。

我可能会保持它内联。并没有太大的伤害,每一点优化都有帮助!

【讨论】:

    【解决方案2】:

    是的

    使用 JSPerf 我在此处描述了我的示例:http://jsperf.com/inline-switch-vs-switch-function

    我使用 4 个简单的算术运算符测试了内联 switch 语句,并在一个包含 100k 项的数组上针对提取到它自己的函数的相同 switch 语句进行了测试。我还使用随机开关运算符、最佳情况运算符(第一个开关选项)和最坏情况运算符(最后一个开关选项)对其进行了测试。

    内联 switch 语句的性能全面优于该函数,在最坏的情况下以约 150 ops/sec 的速度击败该函数,在最佳情况下以约 600 ops/sec 的速度击败该函数。

    在这种情况下,内联 switch 语句会明显更快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-13
      • 2020-04-02
      • 2011-08-16
      • 2020-11-18
      • 2011-03-04
      • 1970-01-01
      相关资源
      最近更新 更多