我在程序中使用余弦定律,这似乎是我的代码的一个慢点。这是我的代码行:
Ans = Math.Sqrt(A ^ 2 + B ^ 2 - 2 * A * B * Math.Cos(C - D))
其中A到D是每次调用时都会改变的双变量。此功能似乎需要大约2000个滴答才能运行。我已经看过使用小角度近似,即if(C-D)足够小,你可以使用cos(C-D)= 1 - ((C-D)^ 2)/ 2。不幸的是,总体来说这比原始代码要慢。我看过任何可用于简化计算的关系,但A和C以复杂的方式相关,B和D以相同的方式相关,A和B之间或C和D之间没有关系
我已经考虑过对(CD)的所有值使用查找函数,但我的准确度目前至少有6位有效数字,我宁愿保持在那个级别,因为这是我输入数据的准确性,简而言之,这意味着在查找中大约有一百万个vaules,这只是该功能的一部分。我想过要查看所有四个值(A,B,C和D),但我不确定如何实现它。
我已经多线程化了这个应用程序并试图使用GPGPU(由于加载进出GPU内存所花费的时间,GPGPU最终变慢了。)
所以,我的问题是如何加快这个功能。
先谢谢!
答案 0 :(得分:3)
以下时间不到1/3
ans = Math.Sqrt(a * a + b * b - 2 * a * b * Math.Cos(c - 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)