2017-01-11 26 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)来指定运行时行为。

相关问题