2014-11-06 63 views
0

我想證明c使用行 - 主要順序作爲內存結構,所以我測量的時間來創建一個行 - 主要數組與列 - 主陣列(乘法* 2)。證明c使用行 - 主排序來安排二維數組

問題是某些東西與循環subrow(array)和subcol(array)的算法不太正確。行優先順序應該在緩存中產生更少的失誤,因此比列主要更快,但我經常得到相反的結果。如果你運行的代碼,你會得到這樣的事情:

行專業花了6511毫秒。 列專業耗時5690毫秒。

請幫我理清算法。

編輯: 有人指出,我實際上並沒有訪問數組,所以我沒有測試訪問速度。我加了sum + = array [i] [j];到subcol和subrow循環,但我仍然得到相同的一致結果行主要順序執行較慢,而相反應該是真實的。也許我在設置循環中的i和j的方式有些問題。 輸出: subrow sum = 784293664 行少花了6737毫秒。 subcol sum = 784293664 列專業花了6594毫秒。

更新的代碼:

#include <stdio.h> 
    #include <sys/time.h> 

    #define ROW 1000 
    #define COL 1000 

    void subrow(int array[ROW][COL]); 
    void subcol(int array[ROW][COL]); 

    int main() 
    { 

     int array[ROW][COL]; 

     int i, j; 

     for(i=0;i<ROW;i++)  // sets the array to each element to x*y then multiplies by 2 
     { 
      for (j=0; j<COL; j++) 
       { 
       array[i][j]=i*j; 
       array[i][j]=array[i][j]*2; 
       } 
     } 

     subrow(array);  //calls the max row function 
     subcol(array);  //calls the max col function 

     return 0; 

    } 

    void subrow(int array[ROW][COL]) 
    { 
     int i,j; 

     struct timeval stop, start; 
     gettimeofday(&start, NULL); 
    int sum = 0; 

     for (i=0;i<ROW;i++) 
     { 
       for (j=0; j<COL; j++) 
     { 
    sum += array[i][j]; 
     } 
     } 

     printf("subrow sum = %d\n", sum); 
     gettimeofday(&stop, NULL); 
     printf("Row-major took %lu miliseconds.\n", (stop.tv_usec - start.tv_usec)); 

     return; 
    } 

    void subcol(int array[ROW][COL]) 
    { 
     int i,j; 

     struct timeval stop, start; // 
     gettimeofday(&start, NULL); 

    int sum = 0; 

     for (i=0; i<COL;i++) 
     { 
       for (j=0; j<ROW; j++) 
       { 
       sum += array[i][j]; 
       } 
     } 
     printf("subcol sum = %d\n", sum); 
     gettimeofday(&stop, NULL); 
     printf("Column-major took %lu miliseconds.\n", (stop.tv_usec - start.tv_usec)); 

     return; 
    } 
+0

PLZ顯示所有的代碼...或者是循環真的是空的? ;) – 2014-11-06 04:30:29

+1

更簡單,比較'&a [0] [1] - &a [0] [0]'到'&a [1] [0] - &a [0] [0]' – 2014-11-06 04:32:05

+0

您可以舉個例子我可以比較這些? – John 2014-11-06 14:19:10

回答

2
for (i=0;i<ROW;i++) 
{ 
    for (j=0; j<COL; j++) 
    { 
    } 
} 

你沒有實際訪問這些循環數組。你只是迭代了幾個int變量。如果您想測試訪問速度,您需要實際讀取或寫入array[i][j]

例如:

int sum = 0; 

for (i=0;i<ROW;i++) 
{ 
    for (j=0; j<COL; j++) 
    { 
     sum += array[i][j]; 
    } 
} 

// Do something with `sum` so the compiler doesn't optimize it, and the loops above, 
// away. 
printf("sum = %d\n", sum); 
+0

我不知道我理解 - 我怎麼能從這些循環讀取數組[i] [j]?你可以給我一個例子嗎? – John 2014-11-06 14:17:52

+0

回答更新了一個例子。 – 2014-11-06 15:28:48

+0

我向代碼添加了您的建議,但我仍然對列專業獲得更快的結果,而反之亦然。我開始認爲我定義了錯誤的循環(j和i)? :/ – John 2014-11-07 01:05:33