所用时间:行主要和列主要和

时间:2013-11-09 04:53:26

标签: c

我遇到过这个问题,我有点困惑。已经给出了两个代码,并且询问哪个代码需要更多时间或两个代码是否需要相同的时间。代码是:

void sumCal(int n,int a[][]){
   int sum=0;
   for(int i=0;i<n;i++){
      for(int j=0;j<n;j++){
         sum=sum+a[i][j];
      }
   }
}

void sumCal(int n,int a[][]){
   int sum=0;
   for(int i=0;i<n;i++){
      for(int j=0;j<n;j++){
         sum=sum+a[j][i];
      }
   }
}

据我所知,这取决于内存布局,内存是否布局主要明智或列主要明智。这是正确的答案吗?

2 个答案:

答案 0 :(得分:1)

确实一个主要问题是矩阵是以行主格式还是列格式格式排列。这是由C标准定义的;它不是编译器编写者的事情。另一个主要问题是数组的大小;如果它足够小以适应缓存,那么你使用哪种机制并不重要,但如果它太大而不适合缓存,那么一种机制比另一种机制快得多。

这是什么?好吧,在维基百科上快速搜索Row-major Order表明C使用了行主要顺序。

答案 1 :(得分:1)

我确实不确定代码是否会首先编译,因为维度需要包含在第一个之后每个维度的数组的函数参数声明中。

无论如何,C是行主要(意味着行中的元素连续存储在内存中,实际上对于C中的多维数组,整个数组是连续的),因此第一个选项可能更快,因为内部循环遍历一个通过迭代列来进行。

最后,您需要知道阵列的大小以及您正在使用的CPU上的L1缓存有多大。如果阵列可以放在L1缓存中,那么两个选项应该以相同的速度运行,因为在完成使用之前不会弹出缓存行。