2016-06-17 6 views
0

я заметил, что код, я работаю над использует условные, как:производительность в условных операторах

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

Но для меня, читая один и тот же код, как показано ниже гораздо проще. Возможно, личное предпочтение.

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

Это очень чувствительный к задержке код, поэтому есть разница в производительности между этими двумя? Есть ли разница в производительности между = или ==? или> или <, если на то пошло? Кроме того, я понимаю, что этот код оставляет место для третьего условия, хотя я уверен, что код оставляет только 2 пути, поэтому if/else более уместен.

Большое значение.

+1

Вы обменяли e порядок сравнений (сначала «A», а затем «B»)? Очень смущает. – unwind

+1

Эти два кода не кажутся эквивалентными, как вы можете сравнить производительность? – Barmar

+1

Да, вам нужно поменять их, иначе вы не будете иметь такую ​​же эквивалентность. Я буду обновлять // код, чтобы это отразить. – janjust

ответ

3

Вот код сборки, когда в состоянии использовать =, обратите внимание, что я добавил 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 <[email protected]> 
    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 <[email protected]> 
    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 <[email protected]> 
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 <[email protected]> 
0x0000000000400567 <+65>: mov eax,0x0 
0x000000000040056c <+70>: leave 
0x000000000040056d <+71>: ret 

Как вы можете заметить, что единственным отличием является использование JE (переход, если равно) или JNE (переход, если не равно), так с точки зрения производительности, можно сказать, что это точно такой же

0

У вас будет условный переход в вашем ассемблерном коде, проверяете ли вы равенство или какое-либо неравенство. Разница в производительности должна быть предельной.

Хотя может быть полезно написать нераспространяемый код, см., Например, Why is it faster to process a sorted array than an unsorted array?.