2011-08-25 75 views
1

所以,兩種情況:函數調用的代價是多少?

案例1:

if (doSomething) doFunction(); 
//... 
void doFunction() { 
    // ... do something time consuming 
} 

案例2:

doFunction(); 
//... 
void doFunction() { 
    if (!doSomething) return; 
    // ... do something time consuming 
} 

這是非常之內的時間敏感的環境中(大約0.1毫秒就會有很大的不同); doFunction()經常被稱爲(約100次的次序),並且大多數情況下不是,doSomething是錯誤的。似乎很明顯,案例1會更有效率,但多少?或者它會不會有所作爲(大約0.01毫秒)?

+3

通過探查器運行,然後你會得到你的答案。 –

+0

我希望這就是這麼簡單...我也想知道在這種情況下g ++可能會做什麼 – polyglot

+0

@polyglot:我用g ++試過了兩種情況的非常簡單的版本,結果非常相似。我懷疑它足夠聰明來優化第二種情況。 – sje397

回答

4

案例1會更有效率。差異的幅度很小,我們正在談論一條指令和幾條指令之間的差異 - 所以在任何可以每秒執行幾百萬條指令的機器上,這是微不足道的。

第一種情況將(通常)由單個條件跳轉指令來實現。

在第二種情況下,除條件跳轉外,函數調用的開銷始終存在。

無論如何,編譯器可能會優化第二種情況,使它們等價。您可以通過查看編譯器輸出來檢查,也可以通過自己計時來檢查。

+0

除函數被內聯外。然後它幾乎是一樣的。 –

1

函數調用包括將東西放在堆棧框架上,稍後在返回時彈出該東西。他們都涉及條件jmp(跳轉),所以這不會影響性能。我會採用第一種方法。

相關問題