2013-01-21 29 views
0

版本A:嵌套如果VS 2獨立的IFs - 性能明智?

if ((A)&&(B)) doSth; 
if (B) doSthElse; 

版B:

if (B) 
{ 
    if (A) doSth; 
    doSthElse; 
} 

這兩個是優選的,性能代價?

注:

  • 實際的代碼將被用於一些每秒百萬次,所以性能和速度是至關重要的。在開始分析之前,如果我錯過了某些東西,請給我一些意見嗎?使用在Mac OS X 10.6.8上使用Clang ++編譯代碼。

回答

2

假設A和B都是簡單的布爾值, 我們需要考慮什麼樣的條件下分解爲的可能性:

  1. 快捷評價:如果(A)有可能解析比(B)爲假,寫(A & & B),否則(B & & A)。

  2. 分支預測:使用更可預見的封裝大塊條件。例如,如果B是可預測的,那麼第二種形式是優選的。

  3. 嘗試不可預測的有條件分配翻譯成(?:),例如,喜歡

    x = c ? a : b; // data dependency 
    

    if (c) x = a; // control flow dependency 
    else x = b; 
    

如果c是不可預測的。 在這種情況下,您希望通過數據依賴關係替代控制流依賴關係,該數據依賴關係可以編譯爲條件移動。當控制依賴不可預測時,這是淨收益。

3

取決於什麼AB是。如果B是一個複雜的函數,第二個函數只評估一次,而第一個函數評估它兩次(當然,如果A成立)。

對於簡單的情形(即兩個bool多個)都不會有問題。

,當然,你可以配置文件,我懷疑這將是一個瓶頸,雖然。

+0

不,這並不複雜,只是一個條件:讓我們說一個簡單的'bool'。 –

+0

@ Dr.Kameleon那麼它應該沒關係。 –

0

如果A和B的值是布爾型,我會建議第三個版本:

if (A & B) doSth; 
if (B) doSthElse; 

這個版本使用按位,並創造一個比較了多個布爾值。這也可以應用於另一個答案中發佈的三元運算符解決方案。

這可能是有益的,因爲它會取代每個& &替代的分支。 大部分時間,安排幾個布爾人在一起比在每個人的價值上做一個分支便宜。這適用於任何具有相對昂貴的分支的cpu架構,這些架構是無序執行或長指令執行管道(佔幾乎所有東西)的任何東西。

重要提示:在x86上,有條件的執行者和分支預測不夠好,如果boolean值的良好預測(例如,很難改變,預測率是99.6%以上),那麼它的實際更有效地使用& &形式並通過其餘條件的捷徑。但ARM和PowerPC架構幾乎總能從更少的分支中受益。