2014-02-06 84 views
5

我有一個switch語句在一些時間關鍵的代碼。我試圖用__builtin_expect來優化它,但它似乎沒有工作。我想知道是否有人可以告訴我,如果我錯過了一些細節,或者如果編譯器沒有爲它優化。我已經試過我的主機上執行以下操作:你可以使用switch語句的builtin_expect

int main() { 
    volatile int v=0; 
    long i = 0; 

    for (i=0; i<1000000000L; i++) { 
      switch(__builtin_expect(v, EXPT)) { 
      case 7: 
        v=7; 
        break; 
      default: 
        v=7; 
        break; 
      } 
    } 
    return v; 
} 

然後我編譯和運行如下:

~/code/builtinexpect> gcc bie.c -o bie -D EXPT=0 && time ./bie 

real 0m2.092s 
user 0m2.086s 
sys  0m0.000s 
~/code/builtinexpect> gcc bie.c -o bie -D EXPT=7 && time ./bie 

real 0m2.092s 
user 0m2.086s 
sys  0m0.000s 

我使用GCC 4.5.1版。

+1

在兩種情況下,生成的彙編代碼如何顯示? – Leeor

回答

4

GCC不支持任何我知道的架構。如果您有一個強烈支持特定情況的switch聲明,那麼您最好的辦法是執行if ... else switch ...聲明。這會導致您正在尋找的優化。

3

兩個case分支(因此所有箱子)做同樣的事情,所以編譯器是免費的v=7整體更換switch語句。即使它沒有(沒有優化),你會期望在時間上有什麼真正的不同嗎?

但更重要的是,__builtin_expect計算爲(v == EXPT),無論是(0)(1),所以case 7:將永遠不會被取出。

+1

他沒有使用編譯器優化,因此代碼應該有所不同,並可能導致強制性錯誤預測,但很好地瞭解布爾值! – Leeor

+3

@Leeor--我喜歡認爲一個分支預測器會在10億次迭代中獲得大部分正確的結果:) –

+1

我希望有一個像樣的__builtin_expect足夠強大,可以強制HW不會。這些HW人需要知道他們的地方:) – Leeor