我正在寫(或者至少嘗試寫)一些高性能的C++代碼(我!)。我遇到了一個需要做大量整數比較的部分,即檢查結果是否等於零。性能:如果(我== 0)對,如果
哪個更有效?也就是說,這需要更少的處理器指令?
if (i == 0) {
// do stuff
}
或
if (!i) {
// do stuff
}
我運行它的x86-64架構,如果有什麼差別。
我正在寫(或者至少嘗試寫)一些高性能的C++代碼(我!)。我遇到了一個需要做大量整數比較的部分,即檢查結果是否等於零。性能:如果(我== 0)對,如果
哪個更有效?也就是說,這需要更少的處理器指令?
if (i == 0) {
// do stuff
}
或
if (!i) {
// do stuff
}
我運行它的x86-64架構,如果有什麼差別。
讓我們看看這段代碼的組件(沒有優化)用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++中,你幾乎不必關心這些微的優化,編譯器/優化都非常好,在這個遊戲:信任他們。如果你不這樣做,並且如果你有性能瓶頸,請查看你的特定平臺的程序集。
注:
OP狀態「我從來沒有描述C++代碼」,所以也許添加如何生成輸出? – 2014-11-23 20:37:19
@FredrikPihl添加爲備註 – quantdev 2014-11-23 20:39:08
更好地瞭解那些沒有編譯器編譯那些以任何不同顯著足夠的,當你做什麼,每個人都必須應用手動優化之前做到這一點。重要:措施。
除非你有一個瘋狂的編譯器,它們應該相同編譯。話雖如此,對於未來的人在看你的代碼的理智,只用i == 0
如果i
是數字型和!i
如果i
是bool
類型。
如果我們按照計算機的實際工作方式來看,表達式「if(!i)」更有效,因爲處理器需要減少它的使用(這在CS [計算機科學]領域稍微有些偏離,但是我以爲我會提到它)。 – cybermonkey 2014-11-23 20:38:08
「計算機的實際工作原理......因爲處理器需要少花錢」 - 請解釋一下。我個人編程的所有處理器(以及我已經完成了相當多的asm)都沒有優勢,因爲在引導下,「bool」的比較與零比較,與「i = = 0'。 – 2014-11-23 20:45:27
現在我已經想到了,這是真的。 – cybermonkey 2014-11-23 20:48:48
上一個體面的編譯器沒有區別。 – quantdev 2014-11-23 20:28:49
在問這裏之前,您是否考慮過分析代碼(或者甚至查看實際裝配輸出)? – 2014-11-23 20:29:32
我希望任何像樣的編譯器都沒有區別[至少在啓用優化時],但我也會運行一些基準來驗證。 – 2014-11-23 20:31:15