重新排列等式

eth*_*ngk 1 c math floating-point optimization performance

我的C代码中有以下等式

k * dl * (1.0 + pHold / centre
       + (pHold * pHold) / (2.0 * centre * centre)
       - square / (2.0 * centre))
Run Code Online (Sandbox Code Playgroud)

我知道浮点除法比乘法要贵得多,而且我已经和它搏斗了一段时间.有没有办法重新排列这个来划分一个师?

谢谢

Lih*_*ihO 7

请注意,在您实际尝试优化某些部分之前,您应该:

  • 确保它是正确的
  • 确保没有办法如何在更高级别优化这个
    我的程序调用此计算的次数是否超过实际需要的次数?
    我可以使用以前的结果?(什么是动态编程?)
  • 一旦你知道瓶颈在哪里,就应该遵循基准标准:
    它看起来很慢......它有多"慢"?......它应该如何"快速"?

但是如果你确定方程本身应该被优化,你可以使用乘法逆的centre出现在你的等式中4次,将除法计数减少到1:

double centreInv = 1.0 / centre;
double pHoldToCentre = pHold * centreInv;
double result = 
    k * dl * (1.0 + pHoldToCentre 
              + 0.5 * pHoldToCentre * pHoldToCentre 
              - 0.5 * square * centreInv);
Run Code Online (Sandbox Code Playgroud)

另请注意,这些更改实际上可能会影响此等式的结果,因此如果您决定更改它,请确保它仍然产生所需的输出.