我需要在我的项目中多次计算ASin。在C#中需要花费很多时间。
我使用System namespace
中的Math.Asin()问题是有什么方法可以在C#中更快地实现Asin功能。
任何近似算法或其他可以更快工作的实现?
答案 0 :(得分:1)
在评论和测试基准之间进行了一些争论后,很明显我在下面给出的解决方案并没有真正改善System.Math.Asin()
的性能。实际上,这两个调用几乎可以忽略不计,不应对任何应用程序产生巨大影响。如果您遇到性能问题,您的原因可能是以下之一:
y = sin(x); z = asin(y)
的内容,那么您将进行额外的不必要的调用。这是一个简单的例子,但更复杂的计算可以在数学上产生类似的效果。这些要点,下面的解决方案仍然是C#优化的有效途径。请注意,在分析应用程序之前不应该进行优化,因此您实际上知道瓶颈是您认为的瓶颈。请注意,这不是优化的唯一途径。并行处理或选择不同算法等路径也是有效的。
有点不同的解决方案,但您可以尝试使用this question的答案加载C标准库。 Windows上的C标准库为msvcrt.dll
,应包含函数asin
:
[DllImport("msvcrt.dll", EntryPoint="asin",
ExactSpelling=false, CharSet=CharSet.Unicode,
SetLastError=true)]
static extern double asin(double radians);
//calling the function
static void Main()
{
double x = asin(0);
}
如果这仍然不够快,你可以在C中编写一个快速的asin算法。有this question,与你的类似。您还可以创建一个更快的平方根函数,以便在此解决方案中使用。
根据您需要的准确度,如果您的角度接近0,您也可以进行泰勒级数近似。您也可以将角度移近零,但这需要一点点更多的诡计。