__CIasin和Arcsine比.NET中的正弦慢得多吗?

时间:2010-10-20 16:08:39

标签: .net profiling trigonometry haversine sine

我一直在运行缓慢的代码区域的som eprofile测试。这是使用Visual Studio 2008和.NET 2(完全修补)。我的计算中约有32%用于Haversine公式。这需要两个正弦,两个余弦,一个平方根和一个正弦 - 所有这些都使用标准的.NET Math库(即Math.Sin,Math.Asin,Math.Sqrt)。我已经能够轻松缓存余弦 - 导致Haversine函数加速大约25-30%。

在个人资料中我看到了__CIasin_pentium4和__CIasin,除了人们发布的堆栈转储之类的东西之外,这些都没有在Google上找到太多。 pentium4变体可以获得大约两倍的样本(包括和不包括)。我假设这是一个正弦波,但它真的比正弦贵得多吗?即使计算的数量是原来的两倍,配置文件中也没有正弦的迹象。

这两个函数都是反正弦的,还是一个正弦函数?如果没有,它们代表什么?

是的我在互联网上看过各种文章和帖子,这里有关于快速的正弦。我确实需要计算正弦的准确性而不是查找表或截断的泰勒级数。我正在使用Haversine计算和/或比较地球表面的距离。 10米精度(我的应用程序的最小恕我直言)相当于约1/640000弧度。

速度的一个想法是多重三角形身份。虽然这会导致更多的trig函数,但它们只会依赖于各个端点,因此变得可缓存。另一个是打开反正弦和平方根进行比较。我认为后者有很大的改进空间,但是目前我正在努力了解处理时间和__CIasin函数究竟代表什么。

2 个答案:

答案 0 :(得分:1)

看起来Pentium FPU具有正弦和余弦(fsin和fcos)的原生指令,但不适用于反正弦。因此我看到的__CIasin函数可能是arcsine的.NET实现,我理解它使用的是Taylor系列。这解释了速度的巨大差异,因此asin出现但罪却没有出现。 (或cos或sqrt为此 - 这些也是本机函数)。

我很久以前就直接编码了x86 FPU。很久以前,我认为它一定是8087 - 无论如何,当时唯一存在的触发是偏切线!

因此,优化的下一个工作是尽可能从Haversine展开反正弦和平方根。结果用于简单大于/小于比较(排序等);并与“固定”值进行比较。在这两种情况下,应该可以解开这些。例如。固定值变为平方(sin(固定)),并与sqrt内的内容进行比较。

我仍然认为触发器身份可能是一个有用的优化,但它肯定会使代码复杂化并引入错误的可能性。

答案 1 :(得分:0)

肯定打开sqrt和arc-sine。反三角函数几乎总是比前向函数慢,因为正向触发功能通常在FPU中实现。