1 #include <stdio.h>
2 #include <time.h>
3
4 int A[1000][2000]={{0}};
5 int B[2000][3000]={{0}};
6 int C[1000][3000]={{0}};
7 void print_matrix(int row,int col,int a[row][col]);
8 int main(){
9
10 int i=1000,k=2000,j=3000;
11 int x,y,z;
12 int start = clock();
13 for(y=0;y<k;y++)
14 for (x=0;x<i;x++)
15 for(z=0;z<j;z++)
16 {
17 C[x][z]+= A[x][y]*B[y][z];
18
19 }
20 int end = clock();
21 printf("time is%d\n ",(end-start));
22 return 0;
当循环顺序是x,y,z时,所需时间最小,约为15.9s。当循环顺序是x,z,y时,时间为33.8s。当循环顺序是y,z,x时,时间是41s。
原因是C[x][z],A[x][y],B[y][z]的读写开销和最后一层循环的变量有关,当最后一层变量是z时,C[x][z]和B[y][z]的内存地址是连续的,
而当最后一层循环变量是x时,C[x][z]和A[x][y]的内存地址是跨页的(4*3000和4*2000>4096字节)。