【发布时间】:2010-10-20 16:08:38
【问题描述】:
我一直在对速度较慢的代码区域进行一些 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 函数所代表的确切含义。
【问题讨论】:
-
那么您使用的是 Math.Sin() 还是外部数学库?
-
是的,我正在使用标准数学库例程 - Math.Sin、Math.Asin 和 Math.Sqrt。我在配置文件中没有看到平方根,但我确实看到了这两个 __CIasin 函数 - 大概来自对 Math.Asin 的调用?
标签: .net profiling haversine trigonometry