哪个循环的速度更快?为什么呢?

SwitchCraft 2007-11-11 04:32:30
for(int i=0;i<n;i++)

VS

for(int i=n;i>0;i--)

“谁的速度更快?为什么?”

本人不懂c++,但是今天被问到这个问题了,一头雾水,可有高手帮忙解释一下?
万分感谢!
...全文
387 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
vanter 2007-11-12
  • 打赏
  • 举报
回复
既然要追究for循环的速度,那肯定不是在PC机上运行,因为照现在PC的速度,这一两条汇编指令影响不了整个系统。

所以我认为这个问题应在嵌入式处理器的特定编译器上讨论。
jack1230 2007-11-12
  • 打赏
  • 举报
回复
后者
thecorr 2007-11-12
  • 打赏
  • 举报
回复
学习了////
Tuzki 2007-11-12
  • 打赏
  • 举报
回复
后者更快.
同意2楼!
justju 2007-11-12
  • 打赏
  • 举报
回复
后者,但不建议这么写。
星光伴月 2007-11-12
  • 打赏
  • 举报
回复
VC++2005将第一种优化成了第二种,只是说明了VC++2005编译器的强大,但不是所有的编译器都能做到这一点.
比如在单片机中.
loops 2007-11-12
  • 打赏
  • 举报
回复
则相应的ZF会置为0,
~~~说错了,应该是被置位,不知道咋翻译:6 ZF Zero Flag -- Set if result is zero; cleared otherwise.
loops 2007-11-12
  • 打赏
  • 举报
回复
应该是2快,因为sub指令如果结果为0,则相应的ZF会置为0, 再直接一个jne就可以判断跳不跳。
有趣的是,在vc2005下,第1钟循环的形式被优化成了第二种的形式,如此造成反倒是第一种循环速度更快,少了个test的指令。

mov esi, 10 ; 0000000aH
npad 6
$LL6@main:

; 315 : for( int i=0; i<n; i++ )
; 316 : {
; 317 : printf("abc\n");

push OFFSET ??_C@_04LMNOPEGE@abc?6?$AA@
call _printf
add esp, 4
sub esi, 1
jne SHORT $LL6@main

; 318 : }
; 319 :
; 320 : for( int i=n; i>0; i-- )

mov esi, 10 ; 0000000aH
npad 9
$LL3@main:

; 321 : {
; 322 : printf("cde\n");

push OFFSET ??_C@_04OHPIIEGK@cde?6?$AA@
call _printf
sub esi, 1
add esp, 4
test esi, esi
jg SHORT $LL3@main

; 323 : }



loops 2007-11-12
  • 打赏
  • 举报
回复
应该是2快,因为sub指令如果结果为0,则相应的ZF会置为0, 再直接一个jne就可以判断。
有趣的是,在vc2005下,第1中循环的形式被优化成了第二种的形式。
星光伴月 2007-11-11
  • 打赏
  • 举报
回复
回答4楼:

1.与0的比较不是特殊指令,而是一般的CPU均有的一条普通指令,并且与0比较多数使用ECX这个寄存器.
2.加法比减法快的说法,我不完全认同.
如果用整型变量(int ,long int ,short int ,char等等)做为循环变量的话,因为在计算机内部,整型数据是用补码表示的,所以加法与减法的速度是相同的.
并且我这里强烈建议使用int型做循环变量,这是因为C/C++编译器通常对int型数据的优化做得最好,使用其他数据类型,如short int ,char等,虽然占用空间少,但是计算速度却不见得快,同样,使用long也不如int快,原因是编译器总是把int类型的数据长度定义成与CPU的字长(位数)相同,即在16位CPU的机器上,int是16位的,在32位机器上,int是32位的,在64位机器上,int是64位的.
如果用浮点数做为循环变量的话,也是允许的,但这时加法可能要比减法快,我决有实际考察过,没有发言权.但有一点可以肯定的是:在float和double的选择上,应该优先考虑使用double而不是float.至于原因,与上面的int是类似的.

----注:我的参考资料是《C++编程思想》一书的相关章节。
zyustc 2007-11-11
  • 打赏
  • 举报
回复
studying!
SwitchCraft 2007-11-11
  • 打赏
  • 举报
回复
谢谢【Turntogo】的回答,看来有特殊指令应该是会快很多。

可是有人说计算机在做加法上比做减法上更快一些,那么计算速度对这两个循环的效率是否有很重要的关系呢?
tangshuiling 2007-11-11
  • 打赏
  • 举报
回复
没有什么差别,除非问问题的人改变编译系统<正如汇编指令sub和add你认为会有什么差别>
星光伴月 2007-11-11
  • 打赏
  • 举报
回复
后者更快.
因为:
for语句括号中的三个部分中,第二个部分是每循环一次都要进行判断,根据判断的结果决定是否继续进行下一次循环.

前者的判断为i<n是将i和n这两个变量进行比较,这时,计算机为了比较这两个变量的值要从内存中读取n的值,放入寄存器,然后再与i相减,最后判断结果是不是0,如果不是0,则继续循环,否则退出循环.

而后者是将i和0进行比较,任何一个CPU都有一个与0比较的指令,编译器将会使用这条指令(一般为JZ或JNZ),这样将省去读内存的时间和相减的时间.
benbon 2007-11-11
  • 打赏
  • 举报
回复
感觉不出谁比谁快

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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