论坛: 编程破解 标题: 循环的效率问题 复制本贴地址    
作者: sniper167 [sniper167]    论坛用户   登录
for(int i = 0 ;i < 10000 ;i ++)
{
  for(int j = 0 ;j < 10 ; j ++)
  {
        ...................
    }
}

for(int i = 0 ;i < 10 ;i ++)
{
  for(int j = 0 ;j < 10000 ; j ++)
  {
        ...................
    }
}
为什么上面的那个效率没有下面的这个高?
是不是在有循环嵌套的时候小循环放在外面会使效率更高一些呢?

地主 发表时间: 04-07-08 10:53

回复: Frankiez [frankiez84]   论坛用户   登录
两个都一样,不过实验表明while比for的速度更快一些,在循环次数较多时应优先考虑while

B1层 发表时间: 04-07-08 13:09

回复: sniper167 [sniper167]   论坛用户   登录
楼上的能说说为什么吗?

B2层 发表时间: 04-07-08 18:15

回复: Frankiez [frankiez84]   论坛用户   登录
不知道,不过是不是这样你可以写个大的循环测试一下

B3层 发表时间: 04-07-08 18:52

回复: sniper167 [sniper167]   论坛用户   登录
怎样测试呀?

B4层 发表时间: 04-07-08 23:10

回复: sniper167 [sniper167]   论坛用户   登录
再顶一下
希望强人能来解释一下

B5层 发表时间: 04-07-11 16:23

回复: windflower [windflower]   论坛用户   登录
不知这样想行不行:
  1,i 计算了1000次,j 计算了1000*10次
  2,i 计算了10次,j 计算了10*1000次

相比之下,是不是第二种方法少了990次计算呢?

B6层 发表时间: 04-07-12 13:28

回复: lida1818 [lida1818]   论坛用户   登录
测试了一下,是下面的一个效率更好,原因我估计是这样:

for(int i = 0 ;i < 10 ;i ++)//产生一次i
        {
        for(int  j = 0 ;j < 10000 ; j ++)//单从循环变量的角度考虑,不涉及循环体内的语句 对程序的影响,那么,j变量是进入此for后产生的
                  也就是说,要产生10次j,若i<10000,则要产生10000次j变量,是不是这个原因造成的, 还请高人指点                   
          {
            c=a;
            a=b;
            b=c;
          }
        }

而这个是:
for( int i = 0 ;i < 10000 ;i ++)//产生一次i
        {
        for(int j = 0 ;j < 10 ; j ++)//产生10000次j变量
          {
            c=a;
            a=b;
            b=c;
          }
        }

B7层 发表时间: 04-07-12 13:37

回复: sniper167 [sniper167]   论坛用户   登录
楼上的 什么意思?
我没咋搞懂喃

B8层 发表时间: 04-07-12 13:56

回复: windflower [windflower]   论坛用户   登录
在内循环中,两种方法语句执行次数是一样的,内存分配也是同等的。
烟雨平生我觉得你的说法有点站不住脚。

B9层 发表时间: 04-07-12 13:58

回复: sniper167 [sniper167]   论坛用户   登录
还有种解释:
前一个i,j的变化都很频繁,如果考虑cache的关系,后一个i的变化不频繁,cpu取数据
可以直接从cache中取,效率自然会高


B10层 发表时间: 04-07-12 14:01

回复: windflower [windflower]   论坛用户   登录
做为一个循环,编译成目标代码后,标志变量必然置入寄存器中,我认为啥都不会的说法也不是问题所在。

B11层 发表时间: 04-07-12 14:08

回复: sniper167 [sniper167]   论坛用户   登录
突然想到内外循环的切换问题
第一种:
for(int i = 0 ;i < 10000 ;i ++)
{
  for(int j = 0 ;j < 10 ; j ++)
  {
        ...................
    }
}
从外循环切换到内循环一共要切换10000次
第二种:
for(int i = 0 ;i < 10 ;i ++)
{
  for(int j = 0 ;j < 10000 ; j ++)
  {
        ...................
    }
}
从外循环切换到内循环一共要切换10次
总的切换次数就少了9990次
不知道这个解释是否正确?



B12层 发表时间: 04-07-12 14:17

回复: 286 [unique]   版主   登录
楼上各位,真的如你们所说吗?

事实上分析一段程序的效率有很多种方法,完全静态分析要求给出是什么架构的计算机,采用什么语言,该语言的编译系统是什么(同为C,编译出的是不一样的。)。如果仅从这一点上说,我认为二者效率一样,都进行了完整的10000次循环。
另外,现在比较通用的方法是,计算当数量量增大时,循环增大的数量级。从这个角度上来说,二者也是等价的。
因为我认为除非该C的编译系统对循环的编译调用效率很低,这样后者频繁调用,效率当然低了,其它的理解我认为应该二者等同。

个人观点,欢迎大家指正。

B13层 发表时间: 04-07-12 17:38

回复: hcz [hcz]   论坛用户   登录
第一个是循环了10000次
for(int j = 0 ;j < 10 ; j ++)
  {
        ...................
    }
复合语句
第二个是循环了10次
  for(int j = 0 ;j < 10000 ; j ++)
  {
        ...................
    }
复合语句
问题就出在循环的是复合语句。

B14层 发表时间: 04-07-13 18:23

回复: hcz [hcz]   论坛用户   登录
其实可以在说的形象点,就打个比方啊,我们去搬100000快砖
按照地一种方法:
{先一块一块的拿到筐里,等筐里有10快了 /*这就相当于for(int j = 0 ;j < 10 ; j ++)
  {
        ...................
    }*/
,在把这筐砖再拿到别的地方去,}
这样重复10000趟就完成了100000块任务了。

而第二中方法呢:
{先一块一块的拿到筐里,等筐里有10000快了 /*这就相当于for(int j = 0 ;j < 10000 ; j ++)
  {
        ...................
    } */
,在把这筐砖再拿到别的地方去,}
这样重复10趟就完成了100000块任务了。

你说哪个快。

B15层 发表时间: 04-07-13 18:37

回复: windflower [windflower]   论坛用户   登录
即然是在同一机器上测试,就不必考虑机器结构,编译系统,操作系统等因素。
所以分析这一问题,就可简单地成为分析算法的问题。
并且可以说就是指令执行时间的问题。

步长累加,终值分析,都是要化时间的,第二种少了990次这种消pao。

如果测试的数据更大,则效果更明显。
我觉得这个问题己没必要再讨论下去了,

B16层 发表时间: 04-07-13 23:22

回复: sniper167 [sniper167]   论坛用户   登录
或许有点钻牛角尖了,平时编程都是些很小的数据,没有必要考虑这些
谢谢

B17层 发表时间: 04-07-14 09:45

回复: bug_me [bug_me]   论坛用户   登录
高效率的程序才是高质量的

B18层 发表时间: 04-07-14 17:58

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号