如果我们在一个内部循环中将一个数除以除法,那么添加特殊情况处理以消除该除法是否明智:

之前:

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


后:

  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];
    }
  }


编译器可以自行推理吗?现代CPU是否包含任何优化方法?

如果您认为附加代码相对于性能提升(是否有任何优势)有利,我尤其感兴趣。

背景:


Numpixels大
crashFactorDepth是90%的时间1
现代CPU:Intel x86 / amd64架构
请不要考虑更广泛的事情。优化了加载的内存开销。
让我们汗流that背,无论如何我们都应该将其作为双倍乘法进行。

最佳答案

通常,答案是“否”。当探查器告诉您有问题时,请先编写清晰的代码,然后对其进行优化。

回答此特定优化是否对特定热点有帮助的唯一方法是:“对其进行测量并查看”。

除非collapseFactorDepth几乎始终为1,或者numPixels很大(至少数千甚至更多),否则我不希望优化会有所帮助(分支机构很昂贵)。

使用SSE或类似的SIMD指令,您更有可能受益。

10-07 19:02