2012-09-15 138 views
0

代碼:不同的功能使用相同的功能,減少開銷

namespace Dialog { 
    enum class Type {Info, Warning, Error}; 
    enum class Buttons {OK, OK_CANCEL, YES_NO, YES_NO_CANCEL}; 
    void Box(Pane* parent, Core::String, Core::String, Buttons, Type); 
} 

我可以這樣定義信息框:

void InfoBox(Core::String title, Core::String text, Buttons b) { 
    Box(nullptr, title, text, b, Type::Info); 
} 

,但這種做法我有開銷,由於額外的函數調用。

如何減少開銷?

+4

這是GUI代碼,對吧?你**不會注意到**的開銷! – jrok

+1

**從來沒有**優化沒有分析和測量! –

+1

爲什麼人們會微觀優化 - 而錯過更大的圖景? –

回答

4

不會有任何。編譯器會輕鬆地嵌入你的函數。即使沒有,與其他GUI開銷相比,調用的開銷也會增加到絕對沒有。

+1

該死的,我忘了編譯器優化... – anhadikal

+0

@anhadikal你*還*忘記了代碼被調用的頻率。在每小時調用一次的函數中,開銷是微不足道的。在每秒鐘被稱爲數百萬次的事情中,這是顯而易見的。 – jalf

0

如果我理解你改正,你可以使用默認參數的概念

void InfoBox(Core::String title="Hello", Core::String text="Info", Buttons b=Buttons::OK,Type typ=Type::Info) { 
    Box(nullptr, title, text, b, Type::Info); 
} 

或也

void Box(Pane* parent=0, Core::String title="Hello", Core::String text="Info", Buttons b=Buttons::OK,Type typ=Type::Info); 

然後您的通話將範圍從

InfoBox(); 
InfoBox("Hi"); 
InfoBox("Hi","Welcome"); 
InfoBox("Hi","Welcome",b=Buttons::OK_CANCEL); 
InfoBox("Hi","Welcome",b=Buttons::OK_CANCEL,Type::Warning); 
+2

這不是對問題的回答。 –

3

爲了討論起見,我們假設一個CPU可以在每個週期執行一條指令。

假設您正在運行一個運行速度僅爲1GHZ的舊式,速度較慢的CPU。我們假設它只有一個核心。

函數調用基本上包括將幾個值推入堆棧,跳到另一個位置,從堆棧中彈出幾個值,並且一旦函數完成,將返回值推入堆棧(在某些調用下約定),並跳回到函數被調用的位置。

我們稱之爲總共10條指令。 假設你的用戶是完全瘋狂的,他每秒鐘打開1000 InfoBox es。

這意味着你浪費了1000 * 10條指令=每秒10,000條指令。

CPU可以每秒運行1,000,000,000條指令。這意味着你正在浪費0.0001%的可用CPU時間。

是否值得擔心?

這並沒有考慮到編譯器優化,這可能會減少開銷,以至於一個很大的零。 (函數調用很可能被內聯)。但在最糟糕的情況下,如果用戶不切實際地急於顯示InfoBox es,那麼粗略估計是,如果用戶不切實際地渴望顯示 es,則會浪費千分之一的CPU的執行時間的百分之一,最壞的情況是