簡體   English   中英

在C if-else語句中,是否應該首先出現更可能的條件?

[英]In the C if-else statement, should the condition which is more likely to be true come first?

我碰巧寫了一個if-else語句,條件在大多數時候都是假的(檢查是否分配了靜態指針)。 編譯器優化哪一個會更好? 或者他們是平等的? 該函數將被調用很多次,因此優化其性能至關重要。

void foo() {
  static int * p = NULL;
  if (p == NULL) {
     p = (int *) malloc( SIZE * sizeof(int)); 
  }
  //do something here
} 

void foo() {
  static int * p = NULL;
  if (p != NULL) {
    //do something here 
  } else {
    p = (int *) malloc( SIZE * sizeof(int));  
    //do something
  }
}

一些編譯器可以允許開發人員指定哪個條件更有可能或不太可能發生。 這在Linux內核中大量使用。

在gcc中,有可能的(x)或不太可能的(x)宏。 例:

if (unlikely(p == NULL)) {
    p = malloc(10);
}

如果經常調用該函數以便不從分支預測器中逐出,則預測器將為您處理所有事情,因為它將非常快速地學習哪個是“可能的”分支。

一些編譯器允許您使用預測提示來裝飾條件。 檢查供應商的文檔,如果可以,請添加提示。

特定平台記錄了默認的預測器行為(例如,參見x86的英特爾優化手冊),但最好由編譯器通過上述提示實現。 事實上,你真的沒有選擇,因為你無論如何都不能控制你的編譯器代碼生成,所以留給你的唯一最后一個措施是自己編寫機器代碼中的代碼並實現平台對默認預測的建議。

最后,它取決於編譯器和它的優化,它從編譯器版本,處理器,編譯器系列改變...

我對這類主題的經驗法則是通過進行一些廣泛的分析來檢查你的實際平台。 我通常也遵循規則“首先正確編碼,僅在需要時進行優化”。 嘗試預先優化通常會導致代碼和設計的可讀性降低(有時甚至沒有更好的性能)。

條件從左到右按順序檢查,這是在C標准中,因此允許條件類似

if( ptr != NULL && ptr->member == value )

這也意味着首先放置最可能是錯誤的條件是有意義的。

http://msdn.microsoft.com/en-us/library/2bxt6kc4.aspx

如果你在尋找性能,我根本就不會使用malloc。 獲取大量的RAM並直接使用它而無需分配釋放包裝器。 另外考慮使用宏代碼會更大但性能也會提高。

#define ASSURE_PTR(a)      if (!a){ \
        a = (int *) malloc (SIZE * sizeof(int)); \
    }

如果經常調用函數,任何體面的分支預測器都會學會很快地預測公共路徑。 請注意,代碼的編譯方式可能與您預期的不同,因為某些編譯器依賴於靜態分支預測 ,並且可能會識別此模式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM