2014-11-23 45 views
-3

我正在寫(或者至少嘗試寫)一些高性能的C++代碼(我!)。我遇到了一個需要做大量整數比較的部分,即檢查結果是否等於零。性能:如果(我== 0)對,如果

哪個更有效?也就是說,這需要更少的處理器指令?

if (i == 0) { 
    // do stuff 
} 

if (!i) { 
    // do stuff 
} 

我運行它的x86-64架構,如果有什麼差別。

+12

上一個體面的編譯器沒有區別。 – quantdev 2014-11-23 20:28:49

+5

在問這裏之前,您是否考慮過分析代碼(或者甚至查看實際裝配輸出)? – 2014-11-23 20:29:32

+0

我希望任何像樣的編譯器都沒有區別[至少在啓用優化時],但我也會運行一些基準來驗證。 – 2014-11-23 20:31:15

回答

8

讓我們看看這段代碼的組件(沒有優化)用gcc:

void foo(int& i) 
{ 
    if(!i) 
    i++; 
} 

void bar(int& i) 
{ 
    if(i == 0) 
    i++; 
} 

int main() 
{ 
    int i = 0; 
    foo(i); 
    bar(i); 
} 

foo(int&):        # @foo(int&) 
    movq %rdi, -8(%rsp) 
    movq -8(%rsp), %rdi 
    cmpl $0, (%rdi) 
    jne .LBB0_2 
    movq -8(%rsp), %rax 
    movl (%rax), %ecx 
    addl $1, %ecx 
    movl %ecx, (%rax) 
.LBB0_2: 
    ret 

bar(int&):        # @bar(int&) 
    movq %rdi, -8(%rsp) 
    movq -8(%rsp), %rdi 
    cmpl $0, (%rdi) 
    jne .LBB1_2 
    movq -8(%rsp), %rax 
    movl (%rax), %ecx 
    addl $1, %ecx 
    movl %ecx, (%rax) 
.LBB1_2: 
    ret 

main:         # @main 
    pushq %rbp 
    movq %rsp, %rbp 
    subq $16, %rsp 
    leaq -8(%rbp), %rdi 
    movl $0, -4(%rbp) 
    movl $0, -8(%rbp) 
    callq foo(int&) 
    leaq -8(%rbp), %rdi 
    callq bar(int&) 
    movl -4(%rbp), %eax 
    addq $16, %rsp 
    popq %rbp 
    ret 

底線:

生成的程序集是完全完全相同(即使沒有啓用優化),所以沒關係:選擇更清晰,最易讀的語法,這可能是您的案例中的if(i == 0)

在C++中,你幾乎不必關心這些微的優化,編譯器/優化都非常好,在這個遊戲:信任他們。如果你不這樣做,並且如果你有性能瓶頸,請查看你的特定平臺的程序集。

注:

  • 您可以使用godbolt.org產生這樣的組裝,這是一個非常方便的工具。
  • 您也可以使用gcc的-S選項生成組件(其他編譯器有類似的選項)
+1

OP狀態「我從來沒有描述C++代碼」,所以也許添加如何生成輸出? – 2014-11-23 20:37:19

+1

@FredrikPihl添加爲備註 – quantdev 2014-11-23 20:39:08

0

更好地瞭解那些沒有編譯器編譯那些以任何不同顯著足夠的,當你做什麼,每個人都必須應用手動優化之前做到這一點。重要:措施。

1

除非你有一個瘋狂的編譯器,它們應該相同編譯。話雖如此,對於未來的人在看你的代碼的理智,只用i == 0如果i是數字型和!i如果ibool類型。

+0

如果我們按照計算機的實際工作方式來看,表達式「if(!i)」更有效,因爲處理器需要減少它的使用(這在CS [計算機科學]領域稍微有些偏離,但是我以爲我會提到它)。 – cybermonkey 2014-11-23 20:38:08

+0

「計算機的實際工作原理......因爲處理器需要少花錢」 - 請解釋一下。我個人編程的所有處理器(以及我已經完成了相當多的asm)都沒有優勢,因爲在引導下,「bool」的比較與零比較,與「i = = 0'。 – 2014-11-23 20:45:27

+0

現在我已經想到了,這是真的。 – cybermonkey 2014-11-23 20:48:48