2013-01-12 63 views
0

我有一個關於優化的練習。我需要優化一個旋轉和成像45度的程序。我知道訪問陣列使用指針效率更高,所以我試圖的變化如下─原來的代碼:優化/使用指針訪問數組

RGB* nrgb = (RGB *)malloc(imgSizeXY*3);//3=sizeof(RGB) 
//... 
for (i=imgSizeY-1; i>=0; --i) 
    { 
     for (j=imgSizeX-1; j>=0; --j) 
     { 
       //... 
       int y=(i*imgSizeX+j); 
       nrgb[y].r = *imgInd; //*imgInd computed earlier 

的變化:

RGB* nrgb = (RGB *)malloc(imgSizeXY*3);//3=sizeof(RGB) 
    RGB* rgbInd = nrgb+imgSizeXY-1; 
    for (i=imgSizeY-1; i>=0; --i) 
    { 
     for (j=imgSizeX-1; j>=0; --j) 
     { 
       rgbInd->r=*imgInd; 
       --rgbInd; 

但使用指針時,該程序產生錯誤的輸出。我一直盯着它幾個小時,仍然不知道爲什麼。有任何想法嗎?非常感謝你!

+5

您在哪裏可以參考「指針語法比數組語法快」 –

+0

45度環繞哪個點?中心或圖像的某個角落? –

+0

@izomorphius中心。所以程序最初移動了座標,乘以旋轉矩陣然後向後移動。我已經將它改進爲包含循環外的最大計算和最小計算,但這仍然是一般想法。如果您有更快速的方法提示,我會很高興聽到他們的聲音。 – nodwj

回答

0

L1高速緩存命中比L2高速緩存命中快一個數量級,它本身比主存訪問快一個數量級。請參閱Numbers Every Computer Scientist Should Know。對於圖像操作,您期望您將不得不執行大量內存讀取和寫入操作,因此在優化代碼時,您應該主要關心緩存效率。

因此,專注於尋找更有效使用緩存的方法,並且不要太擔心編譯器不會優化簡單指針算法。

2

按指針訪問數組元素和按索引訪問沒有區別。你可以看到如果產生彙編代碼。索引notatiin更簡單。

+0

對不起,但我的教導不同...請注意,我們可能會在舊系統上進行測試(如果您的論點依賴於智能現代編譯器)。此外,請注意,對於索引表示法,計算y =(i * imgSizeX + j)應該在每次(!)時保持,而指針表示法避免了該計算並肯定節省了時間 – nodwj

+0

我的意思是您不能通過使用指針表示法而不是索引。但是你改變了算法。你需要調試你的代碼。 –

+0

我的問題已經解決了,所以我已經接受了你的回答 – nodwj