2017-01-11 28 views
0

如果我們在一個內部循環有一個師又一個,就是它的智能添加特殊情況處理,以消除師:是否應該劃一個特例?

BEFORE:

int collapseFactorDepth... 
    for (int i = 0; i < numPixels; i++) 
    { 
     pDataTarget[i] += pPixelData[i]/collapseFactorDepth; 
    } 

AFTER:

if (collapseFactorDepth != 1) 
    { 
    for (int i = 0; i < numPixels; i++) 
    { 
     pDataTarget[i] += pPixelData[i]/collapseFactorDepth; 
    } 
    } 
    else 
    { 
    for (int i = 0; i < numPixels; i++) 
    { 
     pDataTarget[i] += pPixelData[i]; 
    } 
    } 

燦編譯原因本身?現代CPUs是否包含任何方法來優化?

我,如果你在考慮對比的性能增益額外的代碼有益特別感興趣(有沒有?)。

背景:

  • Numpixels大
  • collapseFactorDepth是90%的時間1
  • 現代的CPU:英特爾的x86/AMD64架構
  • 請不要考慮更廣泛的東西。加載的內存開銷被優化。
  • 我們不出汗,我們也許應該這樣做,因爲雙倍增反正。
+1

只是我的想法,如果主叫方希望由一個劃分,就去做。 (我可能不會檢查'0') –

+0

這將是一個不成熟的優化。當你爲一件事情進行優化時,你會對其他事情感到悲觀。更重要的是代碼清晰。 –

+0

只是供參考,如果您要問這樣的表現問題,並且您知道自己在做什麼,那麼爲性能問題本身提供一些背景通常是個好主意。否則,你只會得到一堆(可能無用的)評論和答案,告訴你不要優化。 – Mysticial

回答

2

作爲一般規則,答案是。先寫清楚的代碼,然後在探查器告訴你有問題時再進行優化。

回答這個特定的優化是否會在這個特殊的熱點幫助的唯一途徑是:「衡量一下,看看」。

除非collapseFactorDepth幾乎總是 1,或numPixels是非常大的(至少數千甚至更多),我不希望優化,以幫助(分公司是昂貴的)。

你更容易使用SSE或類似的SIMD指令中受益。

+0

CollapseDepthFactor幾乎總是1(97%)的時間,如果它不會導致性能優勢,我仍然不希望重複該代碼。 –

+0

NumPixels通常是大512x512高達全高清 –

+0

嗯。如果NumPixels很大,你的下一個問題是你必須從內存中獲取所有的數據到CPU並返回;我的直覺是,內存帶寬可能是主導因素 - 所以優化仍然沒有意義。請注意,在過去的35年中,我對性能的直覺是正確的 - 大約三次 - *** **** –

0
  1. 關注@馬丁邦納的建議。在需要時進行優化。
  2. 當你需要:

int identity(int pixel) 
{ 
    return pixel; 
} 

template<int collapseFactorDepth> 
int div(int pixel) 
{ 
    return pixel/collapseFactorDepth; 
} 

struct Div 
{ 
    int collapseFactorDepth_; 
    Div(collapseFactorDepth) 
     : collapseFactorDepth(collapseFactorDepth_) {} 
    int operator()(int pixel) 
    { 
     return pixel/collapseFactorDepth_; 
    } 
}; 

template<typename T> 
void fn(int* pDataTarget, T fn) 
{  
    for (int i = 0; i < numPixels; i++) 
    { 
     pDataTarget[i] += fn(pPixelData[i]); 
    } 
} 

void fn(int* pDataTarget) 
{ 
    fn(pDataTarget, identity); 
} 

template<int collapseFactorDepth> 
void fnComp() 
{ 
    fn(pDataTarget, div<collapseFactorDepth>); 
} 

void fn(int* pDataTarget, int collapseFactorDepth) 
{ 
    fn(pDataTarget, Div(collapseFactorDepth)); 
} 

這爲您提供一個方便的默認行爲,編譯時鴻溝(這可能比除以INT更快)在可能的情況和一種方法(通過Div)來指定運行時行爲。

相關問題