2016-08-20 19 views
-1

例如。在C++中,'if'函數的可讀性有速度差嗎?

bool IsPlayerOutMap() 
{ 
    bool t = (Player.x < 0 || Player.y < 0 
     || Player.x > 1000 || Player.y > 1000); 
    return t; 
} 

if(IsPlayerOutMap()) 
    cnt++; 

if((Player.x < 0 || Player.y < 0 
     || Player.x > 1000 || Player.y > 1000)) 
    cnt++; 

有兩個任何速度差的編碼風格?

+0

不。這裏的功能是可以圈定的。 – milleniumbug

+5

我喜歡微型優化。爲什麼不測量它呢? –

+1

任何半面體編譯器都應該內聯該函數併爲其生成相同的可執行代碼。儘管第二塊代碼中有一對不必要的括號。 – Bernard

回答

1

基本上對於失敗的「如果」你有性能損失。由於CPU有執行管道(它在上一個結束之前開始執行下一個asm命令),所以當你輸入一個「if」時,CPU分支預測(你可以讀到關於它的)選擇執行一個路徑(如果結果是「 true「或」false「),如果錯誤,那麼exec在中間停下來(用NOP替換命令 - 無操作),然後啓動另一個路徑,在這裏你失去了性能。

在你的代碼中,「if」代碼和邏輯語句或多或少是相同的(你可以閱讀「如果快捷方式」來理解原因)。然而,在這裏調用另一個函數可能很重要不像在評論中所說的那樣,編譯器不會總是把它放在內聯中(除非你用標誌指定),甚至在某些情況下內聯代碼更長,然後你就可以獲得更多的緩存抖動(你可以閱讀它)指令緩存。

這就是所謂的微型優化,這裏最好的決定方式是使用profiler。從我的經驗來看,這樣的小優化只在非常特殊的情況下才有意義,例如處理每秒10M數據包和每個納米處理器的路由器。

另一點。總是在「if」代碼中添加大括號是一種更好的代碼風格。它不會影響性能。