2012-07-30 25 views
0

我創建了一個非常簡單的代碼來學習向量訪問是否比矩陣訪問快。矢量訪問比矩陣訪問更快嗎?

我試圖3兩件事:

1:

int *matrix=(int*)malloc(sizeof(int)*100000*1000) 
for(long int=x;x<100000*1000;x++)matrix[x]=1; 

2:帶有int 100.000.000元件創建向量創建具有相同大小的矩陣:

int ** matrix=(int**)malloc(sizeof(int*)*100000); 
for(long int=0; x<100000;x++){ 
    matrix[x]=(int*)malloc(sizeof(int*)*1000); 
} 
for(int x=0; x<100000;x++){ 
    for(int y=0;y<1000;y++){ 
    matrix[x][y]=1; 
    } 
} 

3:創建相同的矢量,但在其中寫入矩陣

for(int x=0; x<100000;x++){ 
    for(int y=0;y<1000;y++){ 
    matrix[(x*1000)+y]=1; 
    } 
} 

始終矩陣訪問(情況2)需要2倍的情況下圖1和3,外殼3是有點快然後情況1 我使用-O2 PARAM在我的C++編譯器(克++)

我可以理解爲什麼向量比矩陣快:(但我會喜歡一些解釋)。 但我不明白爲什麼案例3比案例1更快,我想到乘法過程會使事情減慢很多,而不是讓它變得更快。 我不明白爲什麼,即使差異是0.002(這可能是時間和處理器使用的時間(我想象))

如果我編譯所有3個案例沒有優化案例2是比情況1更慢,情況3. 因此,沒有優化過程,情況1更快。

矢量速度通常更快嗎?

謝謝

回答

1

情況2是最慢的原因是,因爲它有一個更多的間接水平。

在情況1和3您從內存中獲取所需的元素。而在情況2中,您首先必須從內存中獲取行/列數組的地址,然後再從所需元素中獲取。與現代計算機一樣,內存訪問是最昂貴的操作(就執行而言),難怪它要慢得多。

1和3的差異如預期的那樣非常小。擺弄優化選項已經有所作爲,所以在這裏,沒有人可以在知道所使用的確切機器的情況下爲您提供明確的答案。最好的(也是唯一合理的)方法是查看生成的彙編代碼。一個原因可能是,在一個版本中,你的循環變量很長,而另一個版本不是(因此你在那裏做元素地址計算),這取決於你的CPU,這可以有所作爲。

編輯:由於沒有矩陣內存訪問權限,因此您的措辭非常糟糕。記憶總是平坦的。矩陣尋址只是一個「虛擬」尋址(或者直接像你在3中做的那樣)或者是間接的(通過使用不同的語言,比如fortran)。所以你或多或少地區分矩陣的不同內存佈局。在3中,矩陣作爲矩陣中的一個大塊,而在2中,它在內存中逐行/逐列地排列,缺點是它有一個間接級別(但具有好處是可以更快地執行某些操作,例如交換行,並且可以更好地處理垃圾收集器)。還有很多其他方法可以將矩陣存儲在內存中(尤其是如果您必須處理稀疏矩陣)。