闲着没事测试下if-else的执行效率
测试环境:Mac pro i7 2.3Ghz 。。。编译器gcc 4.9,代码没有进行优化-O0;
测试代码:c代码1:
int main(){
int n=100000000;
int b=-1;
int a=0;
while(n-->0){
if(b<0) b--;else b--;
if(b<0) b--;else b--;
if(b<0) b--;else b--;
if(b<0) b--;else b--;
if(b<0) b--;else b--;
if(b<0) b--;else b--;
if(b<0) b--;else b--;
if(b<0) b--;else b--;
if(b<0) b--;else b--;
if(b<0) b--;else b--;
}
return 0;
}
汇编代码1:
_main:
LFB0:
pushl%ebp
LCFI0:
movl%esp, %ebp
LCFI1:
subl$16, %esp
movl$100000000, -4(%ebp)
movl$-1, -8(%ebp)
movl$0, -12(%ebp)
jmpL2
L22:
cmpl$0, -8(%ebp)
jnsL3
subl$1, -8(%ebp)
jmpL4
L3:
subl$1, -8(%ebp)
L4:
cmpl$0, -8(%ebp)
jnsL5
subl$1, -8(%ebp)
jmpL6
L5:
subl$1, -8(%ebp)
L6:
cmpl$0, -8(%ebp)
jnsL7
subl$1, -8(%ebp)
jmpL8
L7:
subl$1, -8(%ebp)
L8:
cmpl$0, -8(%ebp)
jnsL9
subl$1, -8(%ebp)
jmpL10
L9:
subl$1, -8(%ebp)
L10:
cmpl$0, -8(%ebp)
jnsL11
subl$1, -8(%ebp)
jmpL12
L11:
subl$1, -8(%ebp)
L12:
cmpl$0, -8(%ebp)
jnsL13
subl$1, -8(%ebp)
jmpL14
L13:
subl$1, -8(%ebp)
L14:
cmpl$0, -8(%ebp)
jnsL15
subl$1, -8(%ebp)
jmpL16
L15:
subl$1, -8(%ebp)
L16:
cmpl$0, -8(%ebp)
jnsL17
subl$1, -8(%ebp)
jmpL18
L17:
subl$1, -8(%ebp)
L18:
cmpl$0, -8(%ebp)
jnsL19
subl$1, -8(%ebp)
jmpL20
L19:
subl$1, -8(%ebp)
L20:
cmpl$0, -8(%ebp)
jnsL21
subl$1, -8(%ebp)
jmpL2
L21:
subl$1, -8(%ebp)
L2:
movl-4(%ebp), %eax
leal-1(%eax), %edx
movl%edx, -4(%ebp)
testl%eax, %eax
jgL22
movl$0, %eax
leave
c代码2:
int main(){
int n=100000000;
int b=-1;
int a=0;
while(n-->0){
if(b>0) b--;else b--;
if(b>0) b--;else b--;
if(b>0) b--;else b--;
if(b>0) b--;else b--;
if(b>0) b--;else b--;
if(b>0) b--;else b--;
if(b>0) b--;else b--;
if(b>0) b--;else b--;
if(b>0) b--;else b--;
if(b>0) b--;else b--;
}
return 0;
}
汇编代码2:
_main:
LFB0:
pushl%ebp
LCFI0:
movl%esp, %ebp
LCFI1:
subl$16, %esp
movl$100000000, -4(%ebp)
movl$-1, -8(%ebp)
movl$0, -12(%ebp)
jmpL2
L22:
cmpl$0, -8(%ebp)
jleL3
subl$1, -8(%ebp)
jmpL4
L3:
subl$1, -8(%ebp)
L4:
cmpl$0, -8(%ebp)
jleL5
subl$1, -8(%ebp)
jmpL6
L5:
subl$1, -8(%ebp)
L6:
cmpl$0, -8(%ebp)
jleL7
subl$1, -8(%ebp)
jmpL8
L7:
subl$1, -8(%ebp)
L8:
cmpl$0, -8(%ebp)
jleL9
subl$1, -8(%ebp)
jmpL10
L9:
subl$1, -8(%ebp)
L10:
cmpl$0, -8(%ebp)
jleL11
subl$1, -8(%ebp)
jmpL12
L11:
subl$1, -8(%ebp)
L12:
cmpl$0, -8(%ebp)
jleL13
subl$1, -8(%ebp)
jmpL14
L13:
subl$1, -8(%ebp)
L14:
cmpl$0, -8(%ebp)
jleL15
subl$1, -8(%ebp)
jmpL16
L15:
subl$1, -8(%ebp)
L16:
cmpl$0, -8(%ebp)
jleL17
subl$1, -8(%ebp)
jmpL18
L17:
subl$1, -8(%ebp)
L18:
cmpl$0, -8(%ebp)
jleL19
subl$1, -8(%ebp)
jmpL20
L19:
subl$1, -8(%ebp)
L20:
cmpl$0, -8(%ebp)
jleL21
subl$1, -8(%ebp)
jmpL2
L21:
subl$1, -8(%ebp)
L2:
movl-4(%ebp), %eax
leal-1(%eax), %edx
movl%edx, -4(%ebp)
testl%eax, %eax
jgL22
movl$0, %eax
leave执行结果:
看来else执行的效率高一些。。。。