2016-10-18 23 views
5

私は、forループの1つに小さな違いを持っ​​た2つのほぼ同じコードをテストしています。最初は3つのループを使用してインデックスy,z,xを反復し、2番目のループはx,z,yを繰り返します。実行時間の異なるほぼ同じコード - なぜですか?

私の質問は、なぜユーザーの時間と壁時計の時間の違いですか?あるコードと他のコードのメモリ位置のためですか?

test_1.c:

#define N 1000 

// Matrix definition 
long long int A[N][N],B[N][N],R[N][N]; 

int main() 
{ 
    int x,y,z; 
    char str[100]; 

/*Matrix initialization*/ 
    for(y=0;y<N;y++) 
     for(x=0;x<N;x++) 
     { 
      A[y][x]=x; 
      B[y][x]=y; 
      R[y][x]=0; 
     } 
/*Matrix multiplication*/ 
    for(y=0;y<N;y++) 
     for(z=0;z<N;z++) 
      for(x=0;x<N;x++) 
      { 
       R[y][x]+= A[y][z] * B[z][x]; 
      } 
exit(0); 
} 

第コード(test_2.c)そのループの最後での差:

for(x=0;x<N;x++) 
    for(z=0;z<N;z++) 
     for(y=0;y<N;y++) 
     { 
      R[y][x]+= A[y][z] * B[z][x]; 
     } 

Iは/ユーザー/ binに/時間を印刷する場合 - -v ./test_2は、以下の統計情報を提供し、ユーザー/ binに/時間/ながら

Command being timed: "./test_1" 
User time (seconds): 5.19 
System time (seconds): 0.01 
Percent of CPU this job got: 99% 
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:05.22 

:V ./test_1私は、次の統計情報を取得する

Command being timed: "./test_2" 
User time (seconds): 7.75 
System time (seconds): 0.00 
Percent of CPU this job got: 99% 
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:07.76 
+2

これはおそらく、他の方法よりも1つの方法でキャッシュミスが増えるためです。 Googleの "キャッシュデータの地域性"。 –

+0

['cachegrind'](http://valgrind.org/docs/manual/cg-manual.html)のようなキャッシュプロファイリングツールでコードを実行してみてください。 –

答えて

17

基本的には、異なるパターンでメモリにアクセスしています。同じ領域の多くのデータにアクセスしてから、次のメモリなど

実世界のアナロジーが必要な場合は、リーフレットを10の異なる道路(AJ)に配達しているとします。それぞれの家屋の番号は1-10です。あなたはA1、A2、A3 ... A10、B1、B2、B3 ... B10等を送ることができますか... A1、B1、C1 ... J1、A2、B2、C2 ...明らかに、最初の方法はより効率的になるでしょう。それはコンピュータメモリのようなものです。あなたが最近アクセスしたメモリの "近く"のメモリにアクセスする方が効率的です。

関連する問題