当循环次数很大时,while和for谁的效率更高?

jianshi051 2008-03-05 08:34:41
进来看到一本书,上面说当循环次数很大的时候,比如1到2的n次方时,选用while循环再break跳出比用for循环来执行要有效率,这是为什么呢?

for(a,b,c)里面的确是有3个东西,但是换在while里面其实也是有的,他们应该都没有什么冗余的东西呀,难道时for汇编产生的指令要比while的多很多?
...全文
7693 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
jianshi051 2008-03-05
  • 打赏
  • 举报
回复
谢谢大家了 看来的确是while的快~

尤其谢谢Chiyer~
jiarusun000 2008-03-05
  • 打赏
  • 举报
回复 1
如果是要使用break来跳出循环体的话,那就是在循环次数未知的情况下执行的,当然也就不适合用for了。其实,我个人认为for只是一种特殊格式的while,准确的说for只是把初始化条件与改变条件写在了for语句里而已,而while是写在函数体里的。
Rainstorey 2008-03-05
  • 打赏
  • 举报
回复
最接近汇编形式的是do..while循环.经过优化的编译器会把各种循环转换成do..while以方便生成汇编.
sheenl 2008-03-05
  • 打赏
  • 举报
回复
for多一条jump?

我刚才测试了一下, 似乎当循环写的不太合理的时候, while循环更容易接受编译器的优化, 所以可以非原则性的建议多使用while循环代替for循环。
星羽 2008-03-05
  • 打赏
  • 举报
回复 1


for (i = 0; i < 100; ++i)
0041138E mov dword ptr [i],0
00411395 jmp main+30h (4113A0h)
00411397 mov eax,dword ptr [i]
0041139A add eax,1
0041139D mov dword ptr [i],eax
004113A0 cmp dword ptr [i],64h
004113A4 jge main+38h (4113A8h)
{

}




i = 0;
004113A8 mov dword ptr [i],0
while (i < 100)
004113AF cmp dword ptr [i],64h
004113B3 jge main+50h (4113C0h)
{
++i;
004113B5 mov eax,dword ptr [i]
004113B8 add eax,1
004113BB mov dword ptr [i],eax
}
jianshi051 2008-03-05
  • 打赏
  • 举报
回复 3
追求代码效率,也不应该从这个地方下手,问这个问题的人显然对效率缺乏正确的认识。。。

-----------------------------------------------------------------

我知道真正的效率源于数据结构的采用和高效算法的设计,我只是好奇书上提出的这个问题来征求大家意见啊……
雨过白鹭洲 2008-03-05
  • 打赏
  • 举报
回复 1
追求代码效率,也不应该从这个地方下手,问这个问题的人显然对效率缺乏正确的认识。。。
sheenl 2008-03-05
  • 打赏
  • 举报
回复
应该没有差别。 如果你真的感兴趣, 就自己写代码测试一下。
jianshi051 2008-03-05
  • 打赏
  • 举报
回复
嗯 谢谢Chappell ~

3楼的while(1)想说什么呢?
babyvox1999 2008-03-05
  • 打赏
  • 举报
回复
while(1)
  • 打赏
  • 举报
回复
呃这个问题通常是没有办法比较的。
Chappell 2008-03-05
  • 打赏
  • 举报
回复 2
基本上没有区别,即使现在通过汇编代码发现
for多一条汇编语句,也并不代表while的效率就高。

当编译器优化后,while和for都是一样。

像while和for这种语句,只要使用正确是不会造成效率瓶颈的,真正问题在设计上。
所以lz还是把主要心思放到设计。而不是这种语句效率问题上。

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧