当前位置: 代码迷 >> C语言 >> [求助] 哪个循环的速度更快?为什么呢?
  详细解决方案

[求助] 哪个循环的速度更快?为什么呢?

热度:172   发布时间:2007-11-12 12:22:23.0
[求助] 哪个循环的速度更快?为什么呢?

for(int i=0;i <n;i++)

VS

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

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

搜索更多相关的解决方案: 速度  

----------------解决方案--------------------------------------------------------

这个有什么意义么?


----------------解决方案--------------------------------------------------------
#include <stdio.h>
int main()
{
int i,j;
clock_t start,end;
for(j=0;j<3;j++)
{
start=clock();
for(i=0;i<=1000000000;i++);
end=clock();
printf("i++:%lf\n",(double)(end-start)/CLOCKS_PER_SEC);
start=clock();
for(i=1000000000;i>=0;i--);
end=clock();
printf("i--:%lf\n",(double)(end-start)/CLOCKS_PER_SEC);
}
return 0;
}

VC6测试结果:
i++:1.984000
i--:3.109000
i++:1.922000
i--:3.031000
i++:1.907000
i--:3.047000

说明i++比较快,原因未知
----------------解决方案--------------------------------------------------------


不会吧!
我曾经在书上看到说i--快..
谁解释一下..
期待ing
----------------解决方案--------------------------------------------------------
i-- 和 i++ 的快慢与CPU有关,这不属于C语言的问题

我一样快的。

[此贴子已经被作者于2007-11-12 13:23:23编辑过]


----------------解决方案--------------------------------------------------------
以下内容来自百度:

i++和++i孰优孰劣,是编译器实现相关的,实在不必太可以关心这个问题。 最后让我们再回到起点,对于自定义数据类型(主要是指类)说,不需要再做很多汇编代码的分析了,我很清楚的知道为什么会有人循循善诱。 因为前缀式可以返回对象的引用,而后缀式必须返回对象的值,所以导致了在大对象的时候产生了较大的复制开销,引起效率降低,因此会有劝告尽量使用前缀式,尽可能避免后缀式,除非从行为上真的需要后缀式。 这也就是More Effective C++/Term 7中的原文提到的,处理使用者自定义类型(注意不是指内建类型)的时候,应该尽可能的使用前缀式地增/递减,因为他天生体质较佳。 同时,为了保证前缀和后缀对递增/递减的语义的实现保持一致,设计上的一般原则是后缀式的实现以前缀式为基础,这样,后缀式往往多了一次函数调用,这也许也是一个需要考虑的效率因素,不过相比之下,就有点微乎其微了
----------------解决方案--------------------------------------------------------

我做过如下测试:
int main(void)
{
int i;
i=0x1111;
i++;
i=0x1111;
i--;
}
反汇编为:
13F4:01FE BE1111 MOV SI,1111
13F4:0201 46 INC SI
13F4:0202 BE1111 MOV SI,1111
13F4:0205 4E DEC SI


----------------解决方案--------------------------------------------------------
换了几个编译器试了一下
dev-c++ 4.9.9.0

i++:1.781000
i--:1.984000
i++:1.781000
i--:1.907000
i++:1.750000
i--:1.890000

BC 3.1
i++:5.219780
i--:5.164835
i++:5.274725
i--:5.439560
i++:5.274725
i--:5.714286

TC 2.0 (TC2里面提示找不到CLOCKS_PER_SEC这个宏,所以没有除,下面的数值大概除以19.2就是秒数了)
i++:93.000000
i--:94.000000
i++:93.000000
i--:93.000000
i++:94.000000
i--:93.000000

----------------解决方案--------------------------------------------------------
以下是引用cosdos在2007-11-12 13:20:09的发言:
i-- 和 i++ 的快慢与CPU有关,这不属于C语言的问题

我一样快的。

应该是和编译器有关吧...


----------------解决方案--------------------------------------------------------
以下是引用neverTheSame在2007-11-12 13:38:28的发言:

我做过如下测试:
int main(void)
{
int i;
i=0x1111;
i++;
i=0x1111;
i--;
}
反汇编为:
13F4:01FE BE1111 MOV SI,1111
13F4:0201 46 INC SI
13F4:0202 BE1111 MOV SI,1111
13F4:0205 4E DEC SI

这个不仅是 i++、i-- 的问题!
而是for循环判断结束语 的问题...


----------------解决方案--------------------------------------------------------
  相关解决方案