2013-05-26 72 views
2

我在程序中使用餘弦定律,它似乎是我的代碼的一個緩慢點。這是我的代碼行:VB.net中餘弦定律的優化

Ans = Math.Sqrt(A^2 + B^2 - 2 * A * B * Math.Cos(C - D)) 

其中A到D是雙變量,每次調用時都會改變。這個功能似乎需要大約2000個時鐘才能運行。我已經研究過使用小角度近似,即如果(C-D)足夠小,可以使用cos(C-D)= 1 - ((C-D)^ 2)/ 2。不幸的是,結果總體上比原始代碼慢。我研究過任何一種可用於簡化計算的關係,但A和C以複雜的方式相關,B和D以相同的方式相關,A和B之間或C和D之間沒有關係

我曾經想過爲(CD)的所有值使用查找函數,但我的準確性目前是至少6位有效數字,我寧願留在該級別,因爲這是我輸入數據的準確性,簡而言之,這意味着在查找過程中大約有一百萬個值,這只是該函數的一部分。我曾想過要查找所有四個值(A,B,C和D),但我不確定如何實現它。

我也已經多線程這個應用程序,並試圖使用GPGPU(由於花費在GPU和內存之間的時間,GPGPU最終變慢)。

所以,我的問題是如何加快這個功能。

感謝先進!

+0

變量的類型是什麼?如果你使用decmal,你會看到一個緩慢的下降。 –

回答

3

在小於1/3以下運行的時間

ANS = Math.Sqrt(A * A + B * B - 2 * A * B * Math.Cos(三 - d))

下面是證明它的代碼:

Dim sw1 As New Stopwatch 
    Dim sw2 As New Stopwatch 

    Dim ans, a, b, c, d As Double 
    a = 5 
    b = 10 
    c = 4 
    d = 2 

    sw1.Start() 
    For x As Integer = 1 To 10000 
     ans = Math.Sqrt(a^2 + b^2 - 2 * a * b * Math.Cos(c - d)) 
    Next 
    sw1.Stop() 

    sw2.Start() 
    For y As Integer = 1 To 10000 
     ans = Math.Sqrt(a * a + b * b - 2 * a * b * Math.Cos(c - d)) 
    Next 
    sw2.Stop() 

    Console.WriteLine(sw1.ElapsedTicks) 
    Console.WriteLine(sw2.ElapsedTicks) 

    Console.WriteLine(sw2.ElapsedTicks * 100/sw1.ElapsedTicks)