代码之家  ›  专栏  ›  技术社区  ›  winwaed

_ ciasin和arcine比.net中的sine慢得多吗?

  •  1
  • winwaed  · 技术社区  · 15 年前

    我一直在运行一些慢代码区的eprofile测试。这是Visual Studio 2008和.NET 2的版本(完全修补)。我的计算大约有32%被哈弗斯线公式所使用。这需要两个正弦、两个余弦、一个平方根和一个弧正弦——所有这些都使用标准的.NET数学库(即math.sin、math.asin、math.sqrt)。我可以很容易地缓存cosines,从而使haversine函数加速了大约25-30%。

    在我的个人资料中,我看到的是,除了人们发布的堆垛垃圾外,这两个网站都没有在谷歌上找到太多。 Pentium4变种的样本量大约是它的两倍(包括和排除)。我假设这是一个弧正弦,但它真的比一个正弦贵很多吗?即使计算出的正弦数是正常值的两倍,轮廓中也没有正弦的迹象。

    这两个函数都是圆弧,还是一个是正弦?如果不是,它们代表什么?

    是的,我在网上和这里看到过各种关于快餐的文章和帖子。我确实需要计算出的正弦值的精度,而不是查找表或截短的泰勒级数。我用哈弗斯线来计算和/或比较地球表面的距离。10米精度(我的应用程序的最小IMHO)相当于大约1/640000弧度。

    关于速度的一个想法是将三角恒等式多重化。尽管这将导致更多的trig函数,但它们将只依赖于单个端点,因此可以缓存。另一种方法是打开弧线和平方根进行比较。我认为后者有很大的改进空间,但是目前我正试图理解处理时间和函数所代表的具体内容。

    2 回复  |  直到 15 年前
        1
  •  1
  •   winwaed    15 年前

    看起来Pentium FPU有正弦波和余弦(fsin和fcos)的本机指令,但没有反正弦指令。因此,我看到的函数可能是反正弦的.NET实现,我理解它使用泰勒级数。这就解释了速度上的巨大差异,所以asin会出现,而sin不会。(或者说cos或sqrt——这些也是本机函数)。

    很久以前我就直接对x86 FPU进行了编码。很久以前,我想它一定是一个8087-无论如何,那时候唯一的三角函数是偏切线!

    因此,优化的下一个工作是尽可能地从哈弗斯线中展开弧和平方根。结果用于简单的大于/小于比较(排序等);并与“固定”值进行比较。在这两种情况下,应该可以打开它们。固定值变为平方(sin(fixed)),并与sqrt中的值进行比较。

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

        2
  •  0
  •   winwaed    15 年前

    是的,一定要打开sqrt和arc sine。反三角函数几乎总是比前向函数慢,因为前向三角函数通常在FPU中实现。