在不需要的情况下,在函数内部进行函数调用是否较慢


Is it slower to have a function call inside a function when there is no need?

这一直困扰着我,比如说我有一个函数:

public function addItem($item) {
   $this->items[] = $item;
   return $this;
}

然后我有另一个功能,比如:

public function addItems($items) {
    foreach($items as $item) {
        $this->addItem($item); //IS THIS FASTER OR
        $this->items[] = $item;//THIS?
    }
    return $this;
}

基本上,我总是在循环中执行选项1$this->addItem($item),但另一方面,在我看来这是多余的,我可以将项附加到数组中,本质上它做的是相同的事情。只是想知道如果性能有任何差异,哪一个更快。

$this->items[] = $item;

将永远比快(分钟)

$this->addItem($item);

因为第二个版本增加了调用函数的开销,而第一个版本没有。这与您应该为一个元素使用第一个版本而不是array_push()的原因相同。引用手册:

注意:如果使用array_push()向数组中添加一个元素最好使用$array[]=,因为这样就没有调用函数。

函数调用需要一些处理器时间。因此,更少的函数调用->更高的性能。

无论如何

要点是您的代码保持清晰和安全。这样的代码比任何性能都重要得多。

永远记住:

清除中的代码、变量和函数名称您的代码将为您节省大量的时间和健康。

您的案例:addItem()函数提供了一个非常好的抽象。保留它。

在函数addItem()中,您可以进行一些验证和调试。此外,它可以返回指示成功的truefalse

函数跳转原则上比直接访问慢(即1更快)。话虽如此:

  1. 不要担心微观优化。比起快速代码,更喜欢清晰、干净、简洁和/或灵活的代码
  2. 如果您使用一些PHP操作码优化器,那么这些访问很可能是内联的。在这种情况下,没有什么区别

关于基准测试,我学到的最重要的东西是

永远不要相信任何人告诉你什么更快或更慢,直到你自己证明为止

从那以后,我写了几十个基准,并多次证明公众舆论是错误的。