我遇到过这个问题,我有点困惑。已经给出了两个代码,并且询问哪个代码需要更多时间或两个代码是否需要相同的时间。代码是:
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];
}
}
}
据我所知,这取决于内存布局,内存是否布局主要明智或列主要明智。这是正确的答案吗?
答案 0 :(得分:1)
确实一个主要问题是矩阵是以行主格式还是列格式格式排列。这是由C标准定义的;它不是编译器编写者的事情。另一个主要问题是数组的大小;如果它足够小以适应缓存,那么你使用哪种机制并不重要,但如果它太大而不适合缓存,那么一种机制比另一种机制快得多。
这是什么?好吧,在维基百科上快速搜索Row-major Order表明C使用了行主要顺序。
答案 1 :(得分:1)
我确实不确定代码是否会首先编译,因为维度需要包含在第一个之后每个维度的数组的函数参数声明中。
无论如何,C是行主要(意味着行中的元素连续存储在内存中,实际上对于C中的多维数组,整个数组是连续的),因此第一个选项可能更快,因为内部循环遍历一个通过迭代列来进行。
最后,您需要知道阵列的大小以及您正在使用的CPU上的L1缓存有多大。如果阵列可以放在L1缓存中,那么两个选项应该以相同的速度运行,因为在完成使用之前不会弹出缓存行。