评估“else if”是否与在 C 中评估“if”花费的 CPU 时间一样多?

Jer*_*ska 0 c if-statement

初始假设:我们将在 argv[1] 不为 NULL 的情况下运行以下程序 1000 次:

#include<stdio.h>
#include<stdlib.h>


int main( int argc, char *argv[] )  {
 
 if ( argv[1] == NULL ) {
  printf("Usage: a.out argument1");
  exit(1);
}
 else if ( argv[1] != NULL ) {
    
    some_cheap_computation;
    
   
   }

return 0;   
}

Run Code Online (Sandbox Code Playgroud)

在这种情况下,上面的代码是否会比以下代码运行得更快:

#include<stdio.h>
#include<stdlib.h>


int main( int argc, char *argv[] )  {
 
 if ( argv[1] == NULL ) {
  printf("Usage: a.out argument1");
  exit(1);
}
 if ( argv[1] != NULL ) {
    
    some_cheap_computation;
    
   
   }

return 0;   
}

Run Code Online (Sandbox Code Playgroud)

已经了解到,最快的代码将使用 else代替else if。评估是否else ifif在 C 中评估花费的 CPU 时间一样多?

bit*_*ask 5

从字面上看没有区别。编译器会将所有版本优化为相同的代码。可以看出,第二个条件与第一个条件相反。这至少适用于 -O1。使用 -O0,争论性能为零。

请参阅编译版本 1

请参阅编译版本 2

两者都生成这个程序集:

.LC0:
        .string "Usage: a.out argument1"
main:
        mov     rax, QWORD PTR [rsi+8]
        test    rax, rax
        je      .L6
        movsx   eax, BYTE PTR [rax]
        add     eax, 1
        ret
.L6:
        sub     rsp, 8
        mov     edi, OFFSET FLAT:.LC0
        call    printf
        mov     edi, 1
        call    exit
Run Code Online (Sandbox Code Playgroud)