2

我在程序中使用余弦定律,这似乎是我代码的一个慢点。这是我的代码行:

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

其中 A 到 D 是每次调用都会改变的双变量。这个函数似乎需要大约 2000 个滴答声才能运行。我已经研究过使用小角度近似值,如果 (CD) 足够小,您可以使用 cos(CD) = 1 - ((CD)^2)/2。不幸的是,这总体上比原始代码慢。我看过任何可以用来简化计算的关系,但是 A 和 C 以复杂的方式相关,B 和 D 以相同的方式相关,A 和 B 之间或 C 和 D 之间没有关系.

我曾考虑对 (CD) 的所有值使用查找函数,但我的准确度目前至少为 6 位有效数字,我更愿意保持在该水平,因为这是我输入数据的准确度,简而言之,这意味着查找中大约有一百万个值,这只是功能的一部分。我考虑过查找所有四个值(A、B、C 和 D),但我不确定如何实现。

我也已经对这个应用程序进行了多线程处理,并尝试使用 GPGPU(由于加载和加载 GPU 内存所花费的时间,GPGPU 最终变慢了)。

所以,我的问题是如何加快这个功能。

先谢谢了!

4

1 回答 1

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)
于 2013-05-26T22:33:38.283 回答