私は3次元配列についての問題を抱えており、私はそれを理解することができません。私はC++を使用していると仮定し、3次元配列a [i] [j] [k]を持っています。それを横断する異なる順序で6つの方法があります。3次元配列のトラバーサル
I-J-K、I-K-J、J-I-K、J-K-I、K-I-J、K-J-I
今、私はさまざまな方法で実行時間を比較してみてください。
#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の運転時間は、それが常に連続して訪問するメモリ空間から最短になると思う。私は、次のとおりであり、Windowsと私のコードにグラム++ -O0を使用します。しかし、それはj-i-kがさらに高速であることから出てくる。出力は次のようなものです:
656ms 1817ms 310msの8475msの5820ms私はこのプログラムを複数回実行
を11804ms、実行している時間が少し異なりますが、順序は同じまま。私がUbuntuでこのプログラムを実行すると、i-j-kが最も速くなり、かなり混乱します。このプログラムがWindows上でなぜこのように動作するのか、知りたいのですが、ありがとうございます。
さまざまなテストのタイミング情報を追加してください。それはあなたの質問に答えることができる人には役に立ちます。 –
また、テスト注文を変更しようとしています – MBo
@MBo注文を変更しようとしました。私が最初にj-i-kをテストしない限り、それは最も速くなります。私が最初にj-i-kをテストすると、i-j-kより少し遅いです。しかし、それはなぜj-i-kが非常に速いのかを説明していない(少なくともi-k-jよりも速い)。 – AerysNan