我的 C 代码中有以下等式
k * dl * (1.0 + pHold / centre
+ (pHold * pHold) / (2.0 * centre * centre)
- square / (2.0 * centre))
我知道浮点除法比乘法要昂贵得多,我已经为此苦苦思索了一段时间。有什么办法可以重新排列这个以减少 split 吗?
谢谢
最佳答案
请注意,在您实际尝试优化某些部分之前,您应该:
- 确保它正确
- 确保没有办法在更高级别优化它
~ 我的程序调用此计算的次数不是比实际需要的次数多吗?
~ 我可以使用之前的结果吗? ( What is dynamic programming? ) - 一旦您知道瓶颈在哪里,基准测试应该遵循:
~ 它似乎很慢......它有多“慢”? ...它应该变得多“快”?
但如果您确定方程本身应该被优化,您可以利用 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);
另请注意,此类更改实际上可能会影响此等式的结果,因此如果您决定更改它,请确保它仍会产生所需的输出。
关于c - 重新排列方程式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19350796/