do...while, while, for循环效率PK

debug版本:

do

{

sum++;

01321471 mov eax,dword ptr [sum]

01321474 add eax,1

01321477 mov dword ptr [sum],eax

} while (sum < a);

0132147A mov eax,dword ptr [sum]

0132147D cmp eax,dword ptr [a]

01321480 jl main+51h (01321471h)

 

do_begin

执行循环体

;影响标记位的指令

jxx do_begin

 

while (sum < a)

00BF1471 mov eax,dword ptr [sum]

00BF1474 cmp eax,dword ptr [a]

00BF1477 jge main+64h (0BF1484h)

{

sum++;

00BF1479 mov eax,dword ptr [sum]

00BF147C add eax,1

00BF147F mov dword ptr [sum],eax

}

00BF1482 jmp main+51h (0BF1471h)

while_begin

;jxx 影响标志位的指令

执行循环体

jmp while_begin

while_end

 

for (int sum = 0; sum < a; sum++)

//计数器初始化

0039146A mov dword ptr [ebp-18h],0

//步长

00391471 jmp main+5Ch (039147Ch)

00391473 mov eax,dword ptr [ebp-18h]

00391476 add eax,1

00391479 mov dword ptr [ebp-18h],eax

//判断执行条件

0039147C mov eax,dword ptr [ebp-18h]

0039147F cmp eax,dword ptr [a]

00391482 jge main+7Dh (039149Dh)

//执行循环体

{

printf("hehhe");

00391484 mov esi,esp

00391486 push 39585Ch

0039148B call dword ptr ds:[399114h]

00391491 add esp,4

00391494 cmp esi,esp

00391496 call __RTC_CheckEsp (0391140h)

}

0039149B jmp main+53h (0391473h)

 

从中可以看出debug版本do...while的效率要比while的效率高,而while的效率要比for循环高

 

编译器在进行优化时,是将while循环和for循环转化为do...while循环

while循环的优化

if(XXX)

{

do

{

do something

}while(XXX)

}

for循环的优化

for(int i = 0; XXX; ++I)

{

do something

}

 

int i = 0;

while(XXX)

{

do something

++i

}

 

 

int i = 0

if(XXX)

{

do

{

do something

++i

}while(XXX);

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值