我想證明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;
}
PLZ顯示所有的代碼...或者是循環真的是空的? ;) – 2014-11-06 04:30:29
更簡單,比較'&a [0] [1] - &a [0] [0]'到'&a [1] [0] - &a [0] [0]' – 2014-11-06 04:32:05
您可以舉個例子我可以比較這些? – John 2014-11-06 14:19:10