2010-06-24 141 views
3

基本上我有一个数组,并且想为每个元素调用相同的函数。哪种方式更快?循环在函数或多次调用函数中,什么更快?

foreach($elemeents as $element){ 
    callFunction($element); 
} 

OR

function callFunction($leements){ 
    foreach($elements as $element){ 
     //do something 
    } 
} 

thanx提前,即时通讯只是一个初学者

+0

我会做功能的foreach循环,我认为它更快,虽然我没有测试证明它。 – acm 2010-06-24 11:28:28

+0

我实际上做了测试以达到我得到的相同结论。它的速度如我所说,但差异确实很小。 – acm 2010-06-24 11:38:30

回答

3

函数内部的循环可能略快,因为每个函数调用都会有(轻微)成本。但是,这并没有太大的区别。

这实在是不成熟的优化,而the root of all evil

你应该写清楚它,如果它太慢,找出它慢的地方并优化它。

+0

秒... – pinaki 2010-06-24 11:29:14

0

这是一种微型的优化,最有可能没有关系的。做任何事情导致更干净的代码。

如果您知道(不知道猜测)这段代码是否会导致性能问题,那么第二种方法几乎肯定会稍微快一点。

+0

这是因为第一个调用一个单独的函数,但是多次调用foreach,而第二个函数保持在函数内直到foreach完成? – abelito 2010-06-24 11:31:43

+1

@abelito:你说得对。调用一个函数需要一定的开销,尽管通常只在函数做很少工作时才有意义(比如简单的getter或setter),编译器通常可以通过内联函数调用来消除开销。 – 2010-06-24 11:55:32

0

它们本质上是一样的,任何时候的执行差异都是可以忽略的。这归结于偏好。

0

我不认为两者之间会有太大的差别,但从我回忆函数堆栈调用时,第一种方法应该花费更长的时间。

0

在我所知的每种语言中,使用循环更快,因为调用函数时涉及的操作(如将其添加到堆栈中)。

但是,在出现实际性能问题之前,您不应该考虑性能。考虑设计,代码清晰度和低维护成本。

0

总之:第二个应该更快。

详细说明:当函数被调用时,函数参数,局部变量和返回地址被压入内部堆栈并在函数调用完成时从堆栈弹出。这意味着你的第一个变体将为你的数组中的每个值产生这些堆栈操作,而第二个变体只会导致这些堆栈操作一次。