我一直在对慢速代码区域进行一些 eprofile 测试。这适用于 Visual Studio 2008 和 .NET 2(已完全修补)。Haversine 公式使用了大约 32% 的计算。这需要两个正弦、两个余弦、一个平方根和一个反正弦 - 所有这些都使用标准的 .NET 数学库(即 Math.Sin、Math.Asin、Math.Sqrt)。我已经能够轻松地缓存余弦 - 导致 Haversine 函数的加速大约 25-30%。
在配置文件中,我看到 __CIasin_pentium4 和 __CIasin 除了人们发布的堆栈转储之类的内容外,它们在 Google 上都找不到太多内容。pentium4 变体抓取的样本数量大约是原来的两倍(包括和不包括在内)。我假设这是一个反正弦,但它真的比正弦贵得多吗?即使将计算两倍的数量,轮廓中也没有正弦的迹象。
这两个函数都是反正弦,还是一个是正弦?如果不是,它们代表什么?
是的,我在 Internet 和此处看到了有关快速正弦波的各种文章和帖子。我确实需要计算正弦的准确性,而不是查找表或截断的泰勒级数。我正在使用 Haversine 来计算和/或比较地球表面的距离。10m 精度(我的应用程序的最小恕我直言)相当于大约 1/640000 弧度。
一种关于速度的想法是多重化三角恒等式。虽然这会导致更多的三角函数,但它们将变得仅依赖于单个端点,因此变得可缓存。另一个是展开反正弦和平方根以进行比较。我认为后者有很大的改进空间,但是目前我正在尝试了解处理时间的原因以及 __CIasin 函数所代表的确切含义。