【发布时间】:2019-02-21 19:18:23
【问题描述】:
我有一个数组long matrix[8*1024][8*1024],还有两个函数sum1和sum2:
long sum1(long m[ROWS][COLS]) {
long register sum = 0;
int i,j;
for (i=0; i < ROWS; i++) {
for (j=0; j < COLS; j++) {
sum += m[i][j];
}
}
return sum;
}
long sum2(long m[ROWS][COLS]) {
long register sum = 0;
int i,j;
for (j=0; j < COLS; j++) {
for (i=0; i < ROWS; i++) {
sum += m[i][j];
}
}
return sum;
}
当我用给定的数组执行这两个函数时,我得到了运行时间:
sum1:0.19s
sum2:1.25s
谁能解释为什么会有这么大的差异?
【问题讨论】:
-
你编译时启用了所有零售优化,对吧?
-
@selbie 我用 gcc -0O -lrt matrix_sum.c -o matrix_sum
-
顺便说一句,
register关键字现在没有什么作用。除了register-qualified 变量不可寻址这一事实之外,编译器几乎忽略了它。 -
如果您的计时程序一遍又一遍地执行相同的功能,那么您就是在计时硬件将矩阵移动到缓存中的效率。如果你的缓存足够大,那么整个矩阵在第一次通过后就可以放入缓存中,并且时间差异将很小。
-
我想知道循环交换优化是否会以同样快的速度呈现两种实现,如 Why is it faster to process a sorted array than an unsorted array? 中所见。
标签: c