条件陈述中的表现

时间:2016-06-17 16:00:58

标签: c performance instructions

我注意到我正在使用的代码使用条件:

if(A != val) {
   // code B
}
if(B != val) {
  // code A
}

但对我来说,阅读下面的相同代码要容易得多。也许是个人偏好。

if( B == val) {
   //code B
}
if( A == val) {
  //code A
}

这是一个非常对延迟敏感的代码,所以两者之间是否存在性能差异? !=或==之间是否存在性能差异?或者>或者<对于这个问题?此外,我意识到这段代码为第三个条件留下了空间,虽然我很确定代码只留下2条路径,所以if / else更合适。

非常感谢。

2 个答案:

答案 0 :(得分:3)

这是在你使用的条件下的汇编代码!=,请注意我在if语句中添加了一个printf,以便从gdb获得更好的输出:

   0x0000000000400526 <+0>:     push   rbp
   0x0000000000400527 <+1>:     mov    rbp,rsp
   0x000000000040052a <+4>:     sub    rsp,0x10
   0x000000000040052e <+8>:     mov    DWORD PTR [rbp-0xc],0x0
   0x0000000000400535 <+15>:    mov    DWORD PTR [rbp-0x8],0x1
   0x000000000040053c <+22>:    mov    DWORD PTR [rbp-0x4],0x1
   0x0000000000400543 <+29>:    mov    eax,DWORD PTR [rbp-0xc]
   0x0000000000400546 <+32>:    cmp    eax,DWORD PTR [rbp-0x4]
   0x0000000000400549 <+35>:    **je**     0x400555 <main+47>
   0x000000000040054b <+37>:    mov    edi,0x4005f4
   0x0000000000400550 <+42>:    call   0x400400 <puts@plt>
   0x0000000000400555 <+47>:    mov    eax,DWORD PTR [rbp-0x8]
   0x0000000000400558 <+50>:    cmp    eax,DWORD PTR [rbp-0x4]
   0x000000000040055b <+53>:    **je**     0x400567 <main+65>
   0x000000000040055d <+55>:    mov    edi,0x4005f4
   0x0000000000400562 <+60>:    call   0x400400 <puts@plt>
   0x0000000000400567 <+65>:    mov    eax,0x0
   0x000000000040056c <+70>:    leave  
   0x000000000040056d <+71>:    ret

这是为了==:

0x0000000000400526 <+0>:    push   rbp
0x0000000000400527 <+1>:    mov    rbp,rsp
0x000000000040052a <+4>:    sub    rsp,0x10
0x000000000040052e <+8>:    mov    DWORD PTR [rbp-0xc],0x0
0x0000000000400535 <+15>:   mov    DWORD PTR [rbp-0x8],0x1
0x000000000040053c <+22>:   mov    DWORD PTR [rbp-0x4],0x1
0x0000000000400543 <+29>:   mov    eax,DWORD PTR [rbp-0x8]
0x0000000000400546 <+32>:   cmp    eax,DWORD PTR [rbp-0x4]
0x0000000000400549 <+35>:   **jne**    0x400555 <main+47>
0x000000000040054b <+37>:   mov    edi,0x4005f4
0x0000000000400550 <+42>:   call   0x400400 <puts@plt>
0x0000000000400555 <+47>:   mov    eax,DWORD PTR [rbp-0xc]
0x0000000000400558 <+50>:   cmp    eax,DWORD PTR [rbp-0x4]
0x000000000040055b <+53>:   **jne**    0x400567 <main+65>
0x000000000040055d <+55>:   mov    edi,0x4005f4
0x0000000000400562 <+60>:   call   0x400400 <puts@plt>
0x0000000000400567 <+65>:   mov    eax,0x0
0x000000000040056c <+70>:   leave  
0x000000000040056d <+71>:   ret 

你可能会注意到唯一的区别是je的使用(如果相等则跳跃)或jne(如果不相等则跳跃),所以在性能方面你可以说它是&#39;完全相同的

答案 1 :(得分:0)

无论是检查相等还是任何不平等,您的汇编程序代码都会有条件跳转。绩效差异应该是微不足道的。

虽然编写无分支代码可能很有用,但请参阅例如Why is it faster to process a sorted array than an unsorted array?