- 浏览: 36942 次
- 性别:
- 来自: 安徽
最新评论
【C语言】while与for执行效率对比【转】
- 博客分类:
- 开发相关
【C语言】while与for执行效率对比【转】
C语言编译环境: Microsoft Visual C++ 6.0(SP6)
测试程序
- #include "stdio.h"
- void forTest()
- {
- int num = 1234; // 迭代次数
- long sum = 0; // 保存加法结果
- for(int i=0;i<num;i++) // 传统for循环写法
- {
- sum = sum + i; // 计算结果
- }
- printf("forTest:%d\n",sum);
- }
- void whileTest()
- {
- int num = 1234; // 迭代次数
- long sum = 0; // 保存加法结果
- while((num--)>0)
- {
- sum = sum + num; // 计算结果
- }
- printf("whileTest:%d\n",sum);
- }
- void main()
- {
- forTest();
- whileTest();
- }
汇编片段
whileTest()函数汇编后的指令:
--- D:\VC\ForWhile\ForWhile.cpp ------------------------------------------------------------------------------------------
- 17: void whileTest()
- 18: {
- 0040D760 push ebp
- 0040D761 mov ebp,esp
- 0040D763 sub esp,48h
- 0040D766 push ebx
- 0040D767 push esi
- 0040D768 push edi
- 0040D769 lea edi,[ebp-48h]
- 0040D76C mov ecx,12h
- 0040D771 mov eax,0CCCCCCCCh
- 0040D776 rep stos dword ptr [edi]
- 19: int num = 1234;
- 0040D778 mov dword ptr [ebp-4],4D2h
- 20: long sum = 0;
- 0040D77F mov dword ptr [ebp-8],0
- 21:
- 22: while((num--)>0)
- 0040D786 mov eax,dword ptr [ebp-4]
- 0040D789 mov ecx,dword ptr [ebp-4]
- 0040D78C sub ecx,1
- 0040D78F mov dword ptr [ebp-4],ecx
- 0040D792 test eax,eax
- 0040D794 jle whileTest+41h (0040d7a1)
- 23: {
- 24: sum = sum + num;
- 0040D796 mov edx,dword ptr [ebp-8]
- 0040D799 add edx,dword ptr [ebp-4]
- 0040D79C mov dword ptr [ebp-8],edx
- 25: }
- 0040D79F jmp whileTest+26h (0040d786)
- 26:
- 27: printf("whileTest:%d\n",sum);
- 0040D7A1 mov eax,dword ptr [ebp-8]
- 0040D7A4 push eax
- 0040D7A5 push offset string "whileTest:%d\n" (00422fac)
- 0040D7AA call printf (0040d6e0)
- 0040D7AF add esp,8
- 28: }
- 0040D7B2 pop edi
- 0040D7B3 pop esi
- 0040D7B4 pop ebx
- 0040D7B5 add esp,48h
- 0040D7B8 cmp ebp,esp
- 0040D7BA call __chkesp (0040d6a0)
- 0040D7BF mov esp,ebp
- 0040D7C1 pop ebp
- 0040D7C2 ret
--- No source file -------------------------------------------------------------------------------------------------------
分析:
0040D760~0040D776: 保存栈现场 总共10条指令
0040D778: 迭代次数 总共1条指令
0040D77F: 保存加法结果 总共1条指令
0040D786~0040D79F: while循环 总共10条指令
0040D7A1~0040D7AF: 打印结果 总共5条指令
0040D7B2~0040D7C2: 恢复栈现场 总共9条指令
合计: 36条指令
forTest()函数汇编后的指令:
--- D:\VC\ForWhile\ForWhile.cpp ------------------------------------------------------------------------------------------
- 4: void forTest()
- 5: {
- 0040D3F0 push ebp
- 0040D3F1 mov ebp,esp
- 0040D3F3 sub esp,4Ch
- 0040D3F6 push ebx
- 0040D3F7 push esi
- 0040D3F8 push edi
- 0040D3F9 lea edi,[ebp-4Ch]
- 0040D3FC mov ecx,13h
- 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(int i=0;i<num;i++)
- 0040D416 mov dword ptr [ebp-0Ch],0
- 0040D41D jmp forTest+38h (0040d428)
- 0040D41F mov eax,dword ptr [ebp-0Ch]
- 0040D422 add eax,1
- 0040D425 mov dword ptr [ebp-0Ch],eax
- 0040D428 mov ecx,dword ptr [ebp-0Ch]
- 0040D42B cmp ecx,dword ptr [ebp-4]
- 0040D42E jge forTest+4Bh (0040d43b)
- 10: {
- 11: sum = sum + i;
- 0040D430 mov edx,dword ptr [ebp-8]
- 0040D433 add edx,dword ptr [ebp-0Ch]
- 0040D436 mov dword ptr [ebp-8],edx
- 12: }
- 0040D439 jmp forTest+2Fh (0040d41f)
- 13:
- 14: printf("forTest:%d\n",sum);
- 0040D43B mov eax,dword ptr [ebp-8]
- 0040D43E push eax
- 0040D43F push offset string "forTest:%l\n" (00422e80)
- 0040D444 call printf (0040d6e0)
- 0040D449 add esp,8
- 15: }
- 0040D44C pop edi
- 0040D44D pop esi
- 0040D44E pop ebx
- 0040D44F add esp,4Ch
- 0040D452 cmp ebp,esp
- 0040D454 call __chkesp (0040d6a0)
- 0040D459 mov esp,ebp
- 0040D45B pop ebp
- 0040D45C ret
--- 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
--- 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循环慢是不对的.
发表评论
-
PPPD拨号返回结果码
2015-09-18 11:12 67700: pppd已经断开,或者已经成功建立连接后请求方又中 断 ... -
3G相关定时器说明
2014-08-06 10:05 834计时器和计数器RNC 计 ... -
PDP激活被拒绝原因码表
2012-07-19 20:55 2744om: http://wireless.agilent.com ... -
PDP激活被拒绝原因码表
2012-07-19 20:15 0方便查询:这些值是真正的原因,但要注意分析问题时尤其对二次开发 ... -
TCP重传
2012-07-03 20:23 1119为什么TCP存在重传 TCP是 ... -
MTK NVRAM
2012-06-28 19:50 1611nvram是程序用来搭建FAT文件系统的那一块,是fla ... -
TBF与PDP激活
2012-06-18 21:28 1150PDP先激活,CCCH上下行TBF建立流程如下:1、下行TBF ... -
C语言中的内存对齐问题
2012-05-29 10:31 750.C语言中的内存对齐 ... -
MTK内存管理
2012-04-20 00:36 4525MTK 内存管理 分类: MTK2011- ... -
MTK Timer
2012-04-18 14:33 40781. GPTI_StartItem 要精准很多,但是只能 ... -
WinSocket编程——原始套接字[转]
2012-03-26 09:23 4841WinSocket编程——原始套接字[转] ... -
TCP三次握手各种异常
2012-03-20 11:04 1357和TCP三次握手有关的面试题 分类: 网络 ... -
Windows API串口编程参考
2012-03-15 14:12 3344Windows API串口编程参 ... -
V.24 & V.35
2012-03-12 20:25 914V.24 & V.35 (2011-08 ... -
[转]ASCII,Unicode,UTF-8,GB2312编码之间的关系
2012-03-12 18:59 899[转]ASCII,Unicode,UTF-8,GB231 ... -
NVRAM的简单添加 【转】
2012-02-29 10:14 814NVRAM的简单添加 MTK 在这里我只 ... -
MTK获取基站的cell_id 【转】
2012-02-29 10:07 1026MTK获取基站的cell_id 博客分类 ... -
MTK的HTTP连接方式
2012-02-29 10:08 843MTK的HTTP连接方式 博客分类: ... -
MTK中怎样创建和使用lib
2012-02-28 17:17 694MTK中怎样创建和使用lib 博客分类: MT ... -
MMI 和L4通信【转】
2012-02-28 17:16 1095MMI 和L4通信 博客分类: MTK ...
相关推荐
While循环和for循环在C语言里面经常使用,需要讲的地方不多,可以一句话带过。加上while循环和for循环是可以相互完全替代的,所以这里主要讲一下while循环()括号里面可能是何种实现方法,从API的角度来看待while...
浅论C语言在提高程序执行效率上的编程技巧.pdf
c语言之while循环PPT课件.pptx
C语言while、do-while、for循环 课程5
c语言之while循环学习教案.pptx
1.学会使用while、do-while、for语句2.熟练掌握循环结构程序设计方法3.掌握选择结构与循环结构的嵌套
C语言实现求1+2+3+……+100的和,要求分别用while、do while、for循环实现。.txt
这是一个99乘法表,希望初学c语言的童鞋都能学有所成!
本文主要介绍了关于c语言中的for循环程序流程图。
C语言嵌套for循环详细讲解
C语言实现进制转换
C语言版经纬度与高斯投影相互转换函数,实现了不同坐标系之间转换
c语言-while循环
C语言While语句[借鉴].pdf
C语言 JPG转BMP!!
C语言实现 各种排序包括: 直接插入排序,折半插入排序,2—路插入排序和表插入排序;希尔排序和链式基数排序;起泡排序,快速排序,归并排序;简单选择排序,树形选择排序和堆排序。 通过输入不同的数据量和数据...
音频文件数组转成c语言的数组音频文件数组转成c语言的数组音频文件数组转成c语言的数组音频文件数组转成c语言的数组音频文件数组转成c语言的数组音频文件数组转成c语言的数组音频文件数组转成c语言的数组
C语言while循环教(学)案.pdf
本文主要介绍C语言while 语句,这里对while 循环做详细讲解,并提供示例代码,希望能帮助学习C语言的同学
html转C语言字串或数组工具,还可以转图片。是C语言开发网页的好助手。