- 论坛徽章:
- 0
|
--- No source file -------------------------------------------------------------------------------------------------------
分析:
0040D3F0~0040D406: 保存栈现场 总共10条指令
0040D408: 迭代次数 总共1条指令
0040D40F: 保存加法结果 总共1条指令
0040D416~0040D439: for循环 总共12条指令
0040D43B~0040D449: 打印结果 总共5条指令
0040D44C~0040D45C: 恢复栈现场 总共9条指令
合计: 38条指令
程序中二个方法语句区别在于一个是for循环,一个是while循环.
对应于,查看到上述二段汇编指令段while循环比for循环少了二条指令.
程序中for循环用的是传统写法,做下更改将for(int i=0;i<num;i++)改为for(;(num--)>0 ,其汇编指令为:
--- D:\VC\ForWhile\ForWhile.cpp ------------------------------------------------------------------------------------------- 4: void forTest()
- 5: {
- 0040D3F0 push ebp
- 0040D3F1 mov ebp,esp
- 0040D3F3 sub esp,48h
- 0040D3F6 push ebx
- 0040D3F7 push esi
- 0040D3F8 push edi
- 0040D3F9 lea edi,[ebp-48h]
- 0040D3FC mov ecx,12h
- 0040D401 mov eax,0CCCCCCCCh
- 0040D406 rep stos dword ptr [edi]
- 6: int num = 1234;
- 0040D408 mov dword ptr [ebp-4],4D2h
- 7: long sum = 0;
- 0040D40F mov dword ptr [ebp-8],0
- 8:
- 9: for(;(num--)>0;)
- 0040D416 mov eax,dword ptr [ebp-4]
- 0040D419 mov ecx,dword ptr [ebp-4]
- 0040D41C sub ecx,1
- 0040D41F mov dword ptr [ebp-4],ecx
- 0040D422 test eax,eax
- 0040D424 jle forTest+41h (0040d431)
- 10: {
- 11: sum = sum + num;
- 0040D426 mov edx,dword ptr [ebp-8]
- 0040D429 add edx,dword ptr [ebp-4]
- 0040D42C mov dword ptr [ebp-8],edx
- 12: }
- 0040D42F jmp forTest+26h (0040d416)
- 13:
- 14: printf("forTest:%d\n",sum);
- 0040D431 mov eax,dword ptr [ebp-8]
- 0040D434 push eax
- 0040D435 push offset string "forTest:%l\n" (00422e80)
- 0040D43A call printf (0040d6e0)
- 0040D43F add esp,8
- 15: }
- 0040D442 pop edi
- 0040D443 pop esi
- 0040D444 pop ebx
- 0040D445 add esp,48h
- 0040D448 cmp ebp,esp
- 0040D44A call __chkesp (0040d6a0)
- 0040D44F mov esp,ebp
- 0040D451 pop ebp
- 0040D452 ret
复制代码- 4: void forTest()
- 5: {
- 0040D3F0 push ebp
- 0040D3F1 mov ebp,esp
- 0040D3F3 sub esp,48h
- 0040D3F6 push ebx
- 0040D3F7 push esi
- 0040D3F8 push edi
- 0040D3F9 lea edi,[ebp-48h]
- 0040D3FC mov ecx,12h
- 0040D401 mov eax,0CCCCCCCCh
- 0040D406 rep stos dword ptr [edi]
- 6: int num = 1234;
- 0040D408 mov dword ptr [ebp-4],4D2h
- 7: long sum = 0;
- 0040D40F mov dword ptr [ebp-8],0
- 8:
- 9: for(;(num--)>0;)
- 0040D416 mov eax,dword ptr [ebp-4]
- 0040D419 mov ecx,dword ptr [ebp-4]
- 0040D41C sub ecx,1
- 0040D41F mov dword ptr [ebp-4],ecx
- 0040D422 test eax,eax
- 0040D424 jle forTest+41h (0040d431)
- 10: {
- 11: sum = sum + num;
- 0040D426 mov edx,dword ptr [ebp-8]
- 0040D429 add edx,dword ptr [ebp-4]
- 0040D42C mov dword ptr [ebp-8],edx
- 12: }
- 0040D42F jmp forTest+26h (0040d416)
- 13:
- 14: printf("forTest:%d\n",sum);
- 0040D431 mov eax,dword ptr [ebp-8]
- 0040D434 push eax
- 0040D435 push offset string "forTest:%l\n" (00422e80)
- 0040D43A call printf (0040d6e0)
- 0040D43F add esp,8
- 15: }
- 0040D442 pop edi
- 0040D443 pop esi
- 0040D444 pop ebx
- 0040D445 add esp,48h
- 0040D448 cmp ebp,esp
- 0040D44A call __chkesp (0040d6a0)
- 0040D44F mov esp,ebp
- 0040D451 pop ebp
- 0040D452 ret
复制代码 --- No source file -------------------------------------------------------------------------------------------------------
0040D3F0~0040D406: 保存栈现场 总共10条指令
0040D408: 迭代次数 总共1条指令
0040D40F: 保存加法结果 总共1条指令
0040D416~0040D42F: for循环 总共10条指令
0040D431~0040D43F: 打印结果 总共5条指令
0040D442~0040D452: 恢复栈现场 总共9条指令
合计: 36条指令
由此可见,for循环习惯写法for(int i=0;i<num;i++)执行效率低于for(;(num--)>0 写法,而for(;(num--)>0 写法执行效率与while((num--)>0)相同.
因此,一棒子打死说for循环执行效率比while循环慢是不对的. |
|