首先比较for与while的效率问题必须保证循环次数一致
下面简单的分析for与while的效率问题就从最简单的无限循环开始,其余相同:
-
for(;;){
-
}
-
while(1){
-
}
这两句都实现了无限循环的功能,使用gcc编译成汇编代码为:
for:
-
.file "for.c"
-
.text
-
.globl main
-
.type main, @function
-
main:
-
.LFB0:
-
.cfi_startproc
-
pushq %rbp
-
.cfi_def_cfa_offset 16
-
.cfi_offset 6, -16
-
movq %rsp, %rbp
-
.cfi_def_cfa_register 6
-
.L2:
-
jmp .L2
-
.cfi_endproc
-
.LFE0:
-
.size main, .-main
-
.ident "GCC: (Ubuntu 4.9.2-10ubuntu13) 4.9.2"
-
.section .note.GNU-stack,"",@progbits
while:
-
.file "while.c"
-
.text
-
.globl main
-
.type main, @function
-
main:
-
.LFB0:
-
.cfi_startproc
-
pushq %rbp
-
.cfi_def_cfa_offset 16
-
.cfi_offset 6, -16
-
movq %rsp, %rbp
-
.cfi_def_cfa_register 6
-
.L2:
-
jmp .L2
-
.cfi_endproc
-
.LFE0:
-
.size main, .-main
-
.ident "GCC: (Ubuntu 4.9.2-10ubuntu13) 4.9.2"
-
.section .note.GNU-stack,"",@progbits
可见除了文件名不同外,其余全部相同,并且都是执行一次跳转jmp。两种循环效率一样高。
参考:
一般来说,do..while循环要比for,while循环效率要高,从汇编代码中可以看出,在深入理解计算机3.6.5节中可以看出,进行汇编时,会先将for,while转换为do...while
总结:
for循环习惯写法for(int i=0;i<num;i++)执行效率低于for(;(num-->0);)而for(;(num-->0);)写法效率与while((num-->0))相同。