提取功能会导致性能损失吗?

时间:2012-07-06 17:52:49

标签: javascript optimization readability

我正在迭代一个大型数组(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次相关的开销是否会导致明显的性能损失?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

使用JSPerf我在这里描述了我的例子:http://jsperf.com/inline-switch-vs-switch-function

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

内联开关语句的性能优于全面的功能,在最坏的情况下击打功能约150 ops / sec,在最好的情况下约为600 ops / sec。

在这种情况下,内联切换语句会明显加快。