我遇到了一個關於三維數組的問題,我找不到它。假設我使用C++,並且我有一個三維數組a [i] [j] [k]。有六種方式與穿越它的不同的順序:三維數組遍歷
I-J-K,I-K-J,J-11-K,J-K-I,K-I-J,K,J-11
現在,我嘗試比較不同的方式運行時間。我用G ++ -O0在Windows和我的代碼如下:
#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上的行爲如此,非常感謝。
請添加各種測試的時間信息。這對那些能夠回答你的問題的人來說很有用。 –
也嘗試更改測試訂單 – MBo
@MBo我試圖改變順序。只要我不首先測試j-i-k,它將是最快的。如果我首先測試j-i-k,那麼比i-j-k慢一點。但這並不能解釋爲什麼j-i-k如此之快(至少比i-k-j更快)。 – AerysNan