关于失眠的问题While的C语言问题。

【C语言】while与for执行效率对比 - 爪哇哥的爪哇岛 / - ITeye博客
博客分类:
【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&i++)
// 传统for循环写法
sum = sum +
// 计算结果
printf("forTest:%d\n",sum);
void whileTest()
int num = 1234;
// 迭代次数
long sum = 0;
// 保存加法结果
while((num--)&0)
sum = sum +
// 计算结果
printf("whileTest:%d\n",sum);
void main()
forTest();
whileTest();
whileTest()函数汇编后的指令:
--- D:\VC\ForWhile\ForWhile.cpp
------------------------------------------------------------------------------------------
void whileTest()
edi,[ebp-48h]
eax,0CCCCCCCCh
dword ptr [edi]
int num = 1234;
dword ptr [ebp-4],4D2h
long sum = 0;
dword ptr [ebp-8],0
while((num--)&0)
eax,dword ptr [ebp-4]
ecx,dword ptr [ebp-4]
dword ptr [ebp-4],ecx
whileTest+41h ()
sum = sum +
edx,dword ptr [ebp-8]
edx,dword ptr [ebp-4]
dword ptr [ebp-8],edx
whileTest+26h ()
printf("whileTest:%d\n",sum);
eax,dword ptr [ebp-8]
offset string "whileTest:%d\n" (00422fac)
__chkesp ()
--- No source file
-------------------------------------------------------------------------------------------------------
0D776: 保存栈现场 总共10条指令
: 迭代次数 总共1条指令
0040D77F: 保存加法结果 总共1条指令
0D79F: while循环 总共10条指令
~0040D7AF: 打印结果 总共5条指令
~: 恢复栈现场 总共9条指令
合计: 36条指令
forTest()函数汇编后的指令:
--- D:\VC\ForWhile\ForWhile.cpp
------------------------------------------------------------------------------------------
void forTest()
edi,[ebp-4Ch]
eax,0CCCCCCCCh
dword ptr [edi]
int num = 1234;
dword ptr [ebp-4],4D2h
long sum = 0;
dword ptr [ebp-8],0
for(int i=0;i&i++)
dword ptr [ebp-0Ch],0
forTest+38h ()
eax,dword ptr [ebp-0Ch]
dword ptr [ebp-0Ch],eax
ecx,dword ptr [ebp-0Ch]
ecx,dword ptr [ebp-4]
forTest+4Bh (0040d43b)
sum = sum +
edx,dword ptr [ebp-8]
edx,dword ptr [ebp-0Ch]
dword ptr [ebp-8],edx
forTest+2Fh (0040d41f)
printf("forTest:%d\n",sum);
eax,dword ptr [ebp-8]
offset string "forTest:%l\n" (00422e80)
__chkesp ()
--- No source file
-------------------------------------------------------------------------------------------------------
~: 保存栈现场 总共10条指令
: 迭代次数 总共1条指令
0040D40F: 保存加法结果 总共1条指令
0D439: for循环 总共12条指令
40D449: 打印结果 总共5条指令
40D45C: 恢复栈现场 总共9条指令
合计: 38条指令
程序中二个方法语句区别在于一个是for循环,一个是while循环.
对应于,查看到上述二段汇编指令段while循环比for循环少了二条指令.
程序中for循环用的是传统写法,做下更改将for(int i=0;i&i++)改为for(;(num--)&0;),其汇编指令为:
--- D:\VC\ForWhile\ForWhile.cpp
------------------------------------------------------------------------------------------
void forTest()
edi,[ebp-48h]
eax,0CCCCCCCCh
dword ptr [edi]
int num = 1234;
dword ptr [ebp-4],4D2h
long sum = 0;
dword ptr [ebp-8],0
for(;(num--)&0;)
eax,dword ptr [ebp-4]
ecx,dword ptr [ebp-4]
dword ptr [ebp-4],ecx
forTest+41h ()
sum = sum +
edx,dword ptr [ebp-8]
edx,dword ptr [ebp-4]
dword ptr [ebp-8],edx
forTest+26h ()
printf("forTest:%d\n",sum);
eax,dword ptr [ebp-8]
offset string "forTest:%l\n" (00422e80)
__chkesp ()
--- No source file
-------------------------------------------------------------------------------------------------------
~: 保存栈现场 总共10条指令
: 迭代次数 总共1条指令
0040D40F: 保存加法结果 总共1条指令
0D42F: for循环 总共10条指令
0D43F: 打印结果 总共5条指令
0D452: 恢复栈现场 总共9条指令
合计: 36条指令
由此可见,for循环习惯写法for(int i=0;i&i++)执行效率低于for(;(num--)&0;)写法,而for(;(num--)&0;)写法执行效率与while((num--)&0)相同.
因此,一棒子打死说for循环执行效率比while循环慢是不对的.
: 经查看class文件反编译指令发现,Java中执行for循环与执行while循环所需的指令数是一样的,二者执行效率相同.
论坛回复 /
(31 / 13441)
围观围观围观围观中
围观?
我感觉while做赋值快,for做输出快点
这个没有研究,有空看看 .
强烈建议使用VC2003,VC2008等编译器,开启编译优化后再进行一下对比.
VC6实在是太旧了.
好吧...
对编译优化不太了解,了解后再进行对比吧.
楼主用过编译器优化过么?
这么高深的东西还不会。
还有待进一步提高~---
如果你理解迪米特法则(Low Of Demeter,LoD),或许你不会选择for
对这些法则了解不深...
学设计模式的时候也就学了点皮毛.
这论坛都叫javaeye 能不说java吗
版块也没必要区分太细.
迷茫,标题指明是c语言,为什么后面变成了java的讨论了??
因为之前写了一篇【Java语言】while与for执行效率对比,然后想看看C里面的情况,就有了这篇.
后面的只是附加之笔.
见谅,我们可以继续这个话题.
不知道分析的是否全面....
必须一样啊,在java中
兄台为何如此肯定.
& 上一页 1
yeshaoting
浏览: 449577 次
来自: 北京
太感谢了,看到你的文章终于解决这个问题了!
竟然还有马
我刚也遇到这个问题,然后也把默认端口改成了1433,只差最后没 ...
kingbinchow 写道
最近的爪哇岛 没有什么货进项呀 ...
最近的爪哇岛 没有什么货进项呀!扫二维码下载作业帮
2亿+学生的选择
下载作业帮安装包
扫二维码下载作业帮
2亿+学生的选择
C语言关于do-while的问题.以下叙述中正确的是A do-while 语句构成的循环不能用其他语句构成的循环来代替D 用do-while语句构成循环时,只有在while后的表达式为零时结束循环为什么D是对的.难道break不能使循环结束吗.
扫二维码下载作业帮
2亿+学生的选择
你说的是对的.break确实能结束循环.只是你想的比较偏了.出题的人没想到这里而已.A是肯定不对的.因为do-while 或者 while 或者 for 循环是一定能相互替代的,只需要调整对应参数和条件就行.所以这题还是选D.不过答案不够严谨.
为您推荐:
其他类似问题
扫描下载二维码2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
2013年3月 C/C++大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 关于台湾问题的看法 的文章

 

随机推荐