一千萬個為什麽

搜索

優化除法/指數計算

我繼承了一個可能效率低下的Visual Studio/VB.Net數值模擬項目。分析表明該函數被稱為批量(100萬次以上),並且在該函數中花費了整個計算的約50%。這是有問題的部分

Result = (A * (E ^ C))/(D ^ C * B) (where A-C are local double variables and D & E global double variables)

然後將結果與可能還有其他改進的閾值進行比較,但我會在另一天留下它們

任何想法或幫助將不勝感激

史蒂夫

最佳答案

指數運算符(Math.Pow)不是很快,沒有用於計算它的專用CPU指令。你提到D和E是全局變量。如果您可以隔離他們的變化,那將提供一絲希望,讓它更快。使用對數重寫等式:

log(r) = log((a x e^c)/(b x d^c))
       = log(a x e^c) - log (b x d^c)
       = log(a) + log(e^c) - log(b) - log(d^c)
       = log(a) + c*log(e) - log(b) - c*log(d)
       = log(a) - log(b) + c x (log(e) - log(d))
result = exp(r)

這提供了這個函數來計算結果:

  Function calculate(ByVal a As Double, ByVal b As Double, ByVal c As Double, ByVal d As Double, ByVal e As Double) As Double
    Dim logRes = Math.Log(a) - Math.Log(b) + c * (Math.Log(e) - Math.Log(d))
    Return Math.Exp(logRes)
  End Function

我使用StopWatch類計時,它與原始表達式一樣快。當然不是巧合。你可以以某種方式預先計算Math.Log(e) - Math.Log(d)項。

轉載註明原文: 優化除法/指數計算