我遇到了关于三维数组的问题,我无法弄明白。假设我使用的是C ++而且我有一个三维数组a [i] [j] [k]。有六种不同的遍历顺序:
i-j-k,i-k-j,j-i-k,j-k-i,k-i-j,k-j-i
现在我尝试比较不同方式的运行时间。我在Windows上使用g ++ -O0,我的代码如下:
#define N 512
#include<ctime>
#include<iostream>
using namespace std;
int a[N][N][N],b[N][N][N],c[N][N][N];
int main(){
clock_t start;
clock_t finish;
start=clock();
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
for(int k=0;k<N;k++)
c[i][j][k]=a[i][j][k]+b[i][j][k];
finish=clock();
cout<<finish-start<<"ms ";
start=clock();
for(int i=0;i<N;i++)
for(int k=0;k<N;k++)
for(int j=0;j<N;j++)
c[i][j][k]=a[i][j][k]+b[i][j][k];
finish=clock();
cout<<finish-start<<"ms ";
start=clock();
for(int j=0;j<N;j++)
for(int i=0;i<N;i++)
for(int k=0;k<N;k++)
c[i][j][k]=a[i][j][k]+b[i][j][k];
finish=clock();
cout<<finish-start<<"ms ";
start=clock();
for(int j=0;j<N;j++)
for(int k=0;k<N;k++)
for(int i=0;i<N;i++)
c[i][j][k]=a[i][j][k]+b[i][j][k];
finish=clock();
cout<<finish-start<<"ms ";
start=clock();
for(int k=0;k<N;k++)
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
c[i][j][k]=a[i][j][k]+b[i][j][k];
finish=clock();
cout<<finish-start<<"ms ";
start=clock();
for(int k=0;k<N;k++)
for(int j=0;j<N;j++)
for(int i=0;i<N;i++)
c[i][j][k]=a[i][j][k]+b[i][j][k];
finish=clock();
cout<<finish-start<<"ms ";
return 0;
}
我认为i-j-k顺序的运行时间最短,因为它访问的内存空间总是连续的。然而,事实证明j-i-k甚至更快。输出是这样的:
656ms 1817ms 310ms 8475ms 5820ms 11804ms
我多次运行此程序,运行时间略有不同但顺序保持不变。当我在Ubuntu上运行这个程序时,i-j-k变得最快,这让我很困惑。我想知道为什么这个程序在Windows上的表现如此,非常感谢。