2016-03-07 82 views
0

裏面的我的課的方法之一,我宣佈一些局部變量是這樣的:變量聲明VS級的性能

int findClosestPoint(double rRadius) 
    { 
     int iXIndexMult, iYIndexMult, iZIndexMult, iVoxelX, iVoxelY, iVoxelZ, iPIndexVoxel, iV, iV_From, iV_To; 
     double rDist, rDX, rDY, rDZ; 
     double rRadius2 = rRadius*rRadius; 
     double rMinDist = rRadius2; 
     int iFoundVertex = -1; 

     // do stuff 

     retrun iFoundVertex; 
    } 

我調用此方法數千次,所以我認爲這將是一個好主意從方法體移動的變量聲明爲類,所以我收到這樣的事情:

int findClosestPoint(double rRadius) 
    { 
     rRadius2 = rRadius*rRadius; 
     rMinDist = rRadius2; 
     iFoundVertex = -1; 

     // do stuff 

     retrun iFoundVertex; 
    } 

我很驚訝,因爲這種操作的結果是在我的計劃顯著性能下降。

任何人都可以向我解釋爲什麼會發生?

+1

一些潛在閱讀:http://stackoverflow.com/questions/16699247/what-is-cache-friendly-code – lcs

+1

這並不令人驚訝。通過這樣做,您可以阻止編譯器進行優化...不要爲編譯器進行優化,您會誤導它! – Garf365

+0

這可能是一些事情。例如,因爲可卡因暗示緩存線。另一種可能是優化被阻止。例如,'rRadius2'(我假設,基於該名稱)在該函數期間不會改變,因此編譯器可以將其優化爲「const」。作爲一個成員變量,它不能再這樣做了。 –

回答

0

您搬遷從本地​​堆棧這種情況下/寄存器(也許)堆內存。堆比堆棧需要更多時間訪問。

+0

雖然這可能會在理論上回答這個問題,[這將是更可取的](// meta.stackoverflow.com/q/8259)在這裏包含答案的基本部分,並提供供參考的鏈接。 – manetsus

0

始終保持你的變量的範圍儘可能小。這不僅爲編譯器提供了更多優化選項,而且還使您的代碼更具可讀性並避免了副作用。

是什麼導致你的情況性能下降取決於你的編譯器和正是你的功能在// do stuff節做。