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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_28110727/article/details/84316804

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);

}

猜你喜欢

转载自blog.csdn.net/qq_28110727/article/details/84316804