Performance difference of “if if” vs “if else if”

前端 未结 7 1649
遥遥无期
遥遥无期 2020-12-05 17:25

I was just thinking is there any performance difference between the 2 statements in C/C++:

Case 1:

if (p==0)
   do_this();
else if (p==1)
   do_that(         


        
7条回答
  •  轻奢々
    轻奢々 (楼主)
    2020-12-05 18:16

    Assuming simple types (in this case, I used int) and no funny business (didn't redefine operator= for int), at least with GCC 4.6 on AMD64, there is no difference. The generated code is identical:

    0000000000000000 :                                   0000000000000040 :
       0:   85 ff                   test   %edi,%edi               40:   85 ff                   test   %edi,%edi
       2:   74 14                   je     18         42:   74 14                   je     58 
       4:   83 ff 01                cmp    $0x1,%edi               44:   83 ff 01                cmp    $0x1,%edi
       7:   74 27                   je     30         47:   74 27                   je     70 
       9:   83 ff 02                cmp    $0x2,%edi               49:   83 ff 02                cmp    $0x2,%edi
       c:   74 12                   je     20         4c:   74 12                   je     60 
       e:   66 90                   xchg   %ax,%ax                 4e:   66 90                   xchg   %ax,%ax
      10:   f3 c3                   repz retq                      50:   f3 c3                   repz retq 
      12:   66 0f 1f 44 00 00       nopw   0x0(%rax,%rax,1)        52:   66 0f 1f 44 00 00       nopw   0x0(%rax,%rax,1)
      18:   31 c0                   xor    %eax,%eax               58:   31 c0                   xor    %eax,%eax
      1a:   e9 00 00 00 00          jmpq   1f         5a:   e9 00 00 00 00          jmpq   5f 
      1f:   90                      nop                            5f:   90                      nop
      20:   31 c0                   xor    %eax,%eax               60:   31 c0                   xor    %eax,%eax
      22:   e9 00 00 00 00          jmpq   27         62:   e9 00 00 00 00          jmpq   67 
      27:   66 0f 1f 84 00 00 00    nopw   0x0(%rax,%rax,1)        67:   66 0f 1f 84 00 00 00    nopw   0x0(%rax,%rax,1)
      2e:   00 00                                                  6e:   00 00 
      30:   31 c0                   xor    %eax,%eax               70:   31 c0                   xor    %eax,%eax
      32:   e9 00 00 00 00          jmpq   37         72:   e9 00 00 00 00          jmpq   77 
      37:   66 0f 1f 84 00 00 00    nopw   0x0(%rax,%rax,1)
      3e:   00 00 
    

    The extra instruction at the end of case_1 is just for padding (to get the next function aligned).

    This isn't really surprising, figuring out that p isn't changed in that function is fairly basic optimization. If p could be changed (e.g., passed-by-reference or pointer to the various do_… functions, or was a reference or pointer itself, so there could be an alias) then the behavior is different, and of course the generated code would be too.

提交回复
热议问题