注册 登录
编程论坛 C++教室

这两段代码在执行效率上有什么差异啊?

惜缘 发布于 2010-11-03 19:28, 1401 次点击
简述下列两段C语言程序在执行效率上的可能存在的差异,并说明理由
(1)
for(j=0;j<100;j=j+1)
   for(i=0;i<5000;i=i+1)
      x[i][j]=2*x[i][j];
 (2)
for(i=0;i<5000;i=i+1)
   for(j=0;j<100;j=j+1)
      x[i][j]=2*x[i][j];
15 回复
#2
pangding2010-11-03 21:26
理论上没有区别,但实际上由于缓冲区命中概率不同执行效率可能会有一些区别。这是由硬件决定的,不是软件。在不同的机器上效果可能也不一样。
另外编译器可能也会对这种代码做优化,优化后的代码可能没有区别。
#3
shafeilong2010-11-04 12:49
有差异  下面那个的执行速度较慢  因为要回调的次数多
#4
山之子2010-11-04 12:52
没多少差异,从软看效果一样,主要是硬件方面对两个程序有差异。。。
#5
shadow_rong2010-11-04 13:23
没有差异,在VC 6.0环境下, 循环,全部转换成相应的 while循环...
#6
pangding2010-11-04 18:44
3 楼说的是什么意思?回调次数多?
我觉得这个速度差,主要是内存访问延时带来的。其它方面的速度差基本可以忽略。
#7
小K鸟2010-11-04 20:10
我感觉差不多啊
#8
小K鸟2010-11-04 20:21
林锐   博士(高质量C++/C   编程指南)一书关于for语句效率的载录:

在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU   跨切循环层的次数。
#9
小K鸟2010-11-04 20:26
第二段代码的在循环的赋初值次数和逻辑比较次数也比第一段多很多
#10
xin3109232010-11-04 22:17
回复 8楼 小K鸟
支持你的看法
#11
sunmingchun2010-11-04 22:27
时间复杂度一样的啊!
#12
yxwsbobo2010-11-05 17:25
太小了  i 和 j 应该各再加2个0



如果是考题的话,答案应该是2慢,2中的条件判断比1多,影响了速度


实际测试的话应该是2快,访问变量的时候,最好变量之间的地址要近,否则的内存命中非常低,速度更慢 CPU一次读取64K  有可能64K只用了1个字节,剩余的全白读了
#13
burellow2010-11-06 18:19
回复 8楼 小K鸟
支持
#14
pangding2010-11-06 19:43
经12楼一解释感觉茅塞顿开~~~
#15
VenusNefu2010-11-24 15:50
回复 12楼 yxwsbobo
同意
#16
wenxinwukui2010-11-24 21:25
楼主问的问题假设数组时a[100][5000],即方法(1)是先循环行号,再循环列号
现在在计算机上存储数组大部分是按行优先存储的,也就是说在计算机上是先存完一行在存第二行的,如下:
a[0][0],a[0][1]...a[0][n],a[1][0],a[1][1],...a[1][n],a[2][0],a[2][1]...
这样一来在第(1)种方法中定位更快点,可能是这样定位的:先取第一行的第一个元素a[0][0],接着取第一行的第二个元素a[0][1],直到取完第一行的最后一个元素a[0][n],接着行号加1直接取a[1][0]。因为数组在内存中是连续的空间,所以指针只需要做一个加1运算既可以直接定位,速度快了很多。
而如果按照第(2)种方法先对列号进行循环这样的话第一次访问a[0][0],第二次访问a[1][0]...可以看到,每次指针不仅要做加1操作,而且还要定位指针,这样的话每次都多了寻址时间,所以当数量大时效果肯定远远不如方法(1)。
个人的见解,有错误希望指正。
1