|
![]() | 作者: 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号