C#/ XNA - 乘法比分区更快?

Dan*_*eny 9 c# optimization xna compiler-optimization

我最近看到一条推文让我很困惑(这是由XNA编码器在编写XNA游戏时发布的):

当天的微优化提示:在可能的情况下,在高频区域使用乘法而不是除法.它的速度提高了几个周期.

我很惊讶,因为我一直认为编译器非常聪明(例如,使用位移),最近读了Shawn Hargreaves的一篇文章说了很多相同的事情.我想知道这有多少真相,因为我的游戏中有很多计算.

我询问,希望有一个样本,但原始的海报无法给出一个.然而,他这样说:

不一定是"center = width/2"之类的东西.而且我已经确定"是的,这是值得的".:)

所以,我很好奇......

任何人都可以给出一些代码示例,您可以将分区更改为乘法并获得性能增益,其中C#编译器本身无法执行相同的操作.

Jer*_*fin 7

当你给他们机会时,大多数编译器都可以做出合理的优化工作.例如,如果你除以一个常数,那么编译器可以/将优化它的可能性非常大,所以它的完成速度与你可以合理地替代它的速度一样快.

但是,如果你有两个提前未知的值,并且你需要将一个值除以另一个来得到答案,如果编译器有很多方法可以对它做很多事情,它会 - 和就此而言,如果编译器有很大的空间来优化它,那么CPU会这样做,所以编译器不必这样做.

编辑:对于类似的东西(这是相当现实的)最好的选择可能是这样的:

double scale_factor = get_input();

for (i=0; i<values.size(); i++)
    values[i] /= scale_factor;
Run Code Online (Sandbox Code Playgroud)

这相对容易转换为:

scale_factor = 1.0 / scale_factor;

for (i=0; i<values.size(); i++)
    values[i] *= scale_factor;
Run Code Online (Sandbox Code Playgroud)

对于特定的编译器来说,我无法真正保证这一点.它基本上是强度降低和环路提升的组合.当然有优化器知道如何做到这两点,但我所看到的C#编译器表明它可能没有(但我从未测试过这样的任何东西,我做的测试是几个版本回来......)

  • @DanTup - Danny Tuppeny:重新排列整个算法以使倒置工作甚至超出了最复杂的编译器. (2认同)