版本A:
#include<time.h>
#include<stdio.h>
int main()
{
time_t start = time(0); //denote start time
int i,j; // initialize ints
static double dst[4096][4096]; //initialize arrays
static double src[4096][4096]; //
for(i=0; i<4096; ++i){
for(j=0; j<4096; ++j){
dst[i][j] = src[i][j];
}
}
time_t end = time(0); //denote end time
double time = difftime(end, start); //take difference of start and end time to determine elapsed time
printf("Test One: %fms\n",time);
}
版本B:
#include<time.h>
#include<stdio.h>
int main()
{
time_t start = time(0); //denote start time
int i,j; // initialize ints
static double dst[4096][4096]; //initialize arrays
static double src[4096][4096]; //
for(i=0; i<4096; ++i){
for(j=0; j<4096; ++j){
dst[j][i] = src[j][i];
}
}
time_t end = time(0); //denote end time
double time = difftime(end, start); //take difference of start and end time to determine elapsed time
printf("Test One: %fms\n",time);
}
使用这个程序,我已经确定如果你反转数组中i和j的位置,执行时间会长1秒。
为什么会这样?
答案 0 :(得分:3)
在你的代码中,循环意味着“逐行遍历同一行中的地址,然后转到下一行”。但是如果你反转i和j的位置,这意味着“逐个遍历同一列中的地址,转到下一列”。
在C中,多维数组逐字节地放在线性地址空间上,然后逐行放置,所以dst[i][j] = src[i][j]
在你的情况下意味着*(dst + 4096 * i + j) = *(src + 4096 * i + j)
:
*(dst + 4096 * 0 + 0) = *(src + 4096 * 0 + 0);
*(dst + 4096 * 0 + 1) = *(src + 4096 * 0 + 1);
*(dst + 4096 * 0 + 2) = *(src + 4096 * 0 + 2);
//...
反转i
而j
表示:
*(dst + 4096 * 0 + 0) = *(src + 4096 * 0 + 0);
*(dst + 4096 * 1 + 0) = *(src + 4096 * 1 + 0);
*(dst + 4096 * 2 + 0) = *(src + 4096 * 2 + 0);
//...
因此,在第二种情况下额外的1秒是由于以非连续的方式访问内存。
您不需要自己进行时间计算,因为您可以在linux / UNIX上使用“time”命令运行程序:
$ time ./loop
我的linux盒子上的结果为2例:
$ time ./loop_i_j
real 0m0.244s
user 0m0.062s
sys 0m0.180s
$ time ./loop_j_i
real 0m1.072s
user 0m0.995s
sys 0m0.073s
答案 1 :(得分:0)
#include<time.h>
#include<stdio.h>
int main()
{
time_t start = time(0); //denote start time
int i,j; // initialize ints
static double dst[4096][4096]; //initialize arrays
static double src[4096][4096]; //
for(j=0; j<4096; ++j){
for(i=0; i<4096; ++i){
dst[j][i] = src[j][i];
}
}
time_t end = time(0); //denote end time
double time = difftime(end, start); //take difference of start and end time to determine elapsed time
printf("Test One: %fms\n",time);
}
我进行了测试,在逆转和正常后两种情况下都给了我这个o / p Test One: 0.000000ms
。我用过gcc编译器。
也许问题是你没有加入stdio.h
。我没有加入stdio.h
时遇到了同样的行为。
在编译期间与内存(堆栈)分配相关的东西可能是原因。