裏面的我的課的方法之一,我宣佈一些局部變量是這樣的:變量聲明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;
}
我很驚訝,因爲這種操作的結果是在我的計劃顯著性能下降。
任何人都可以向我解釋爲什麼會發生?
一些潛在閱讀:http://stackoverflow.com/questions/16699247/what-is-cache-friendly-code – lcs
這並不令人驚訝。通過這樣做,您可以阻止編譯器進行優化...不要爲編譯器進行優化,您會誤導它! – Garf365
這可能是一些事情。例如,因爲可卡因暗示緩存線。另一種可能是優化被阻止。例如,'rRadius2'(我假設,基於該名稱)在該函數期間不會改變,因此編譯器可以將其優化爲「const」。作爲一個成員變量,它不能再這樣做了。 –