循环的执行速度随可变位置而变化

时间:2013-11-19 06:09:01

标签: c arrays time execution

版本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秒。

为什么会这样?

2 个答案:

答案 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);
//...

反转ij表示:

*(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时遇到了同样的行为。

在编译期间与内存(堆栈)分配相关的东西可能是原因。