2010-06-24 38 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

總之:第二個應該更快。

詳細說明:當函數被調用時,函數參數,局部變量和返回地址被壓入內部堆棧並在函數調用完成時從堆棧彈出。這意味着你的第一個變體將爲你的數組中的每個值產生這些堆棧操作,而第二個變體只會導致這些堆棧操作一次。