首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在.NET中,__CIasin比正弦慢得多吗?

在.NET中,__CIasin比正弦慢得多吗?
EN

Stack Overflow用户
提问于 2010-10-21 00:08:39
回答 2查看 239关注 0票数 1

我已经对一个缓慢的代码区域运行了一些eprofile测试。这是Visual Studio2008和.NET 2(完全修补)。我的计算大约有32%是由Haversine公式使用的。这需要两个正弦、两个余弦、一个平方根和一个正弦-所有这些都使用标准的.NET数学库(即:Math.Sin、Math.Asin、Math.Sqrt)。我已经能够很容易地缓存余弦-导致Haversine函数的加速大约为25-30%。

在个人资料中,我看到了__CIasin_pentium4和__CIasin,除了人们发布的堆栈转储之类的东西,这两个网站在谷歌上都找不到太多东西。pentium4变体获取了大约两倍的样本(包括包含性和排除性)。我假设这是一个正弦正弦,但它真的比正弦昂贵吗?轮廓中没有正弦的迹象,即使将计算两倍的正弦。

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

是的,我在互联网上和这里看到了各种关于快速正弦的文章和帖子。我真的需要计算正弦的精度,而不是查找表或截断的泰勒级数。我正在使用哈弗正弦来计算和/或比较地球表面的距离。10m精度(我的应用程序的最小IMHO )相当于大约1/640000弧度。

关于速度的一种想法是对三角恒等式进行乘法运算。虽然这将导致更多的trig函数,但它们将变得仅依赖于单个端点,因此变得可缓存。另一种方法是展开正弦和平方根,以便进行比较。我认为后者有很大的改进余地,但是目前我正在试图理解是什么在消耗处理时间,以及__CIasin函数到底代表了什么。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-22 02:35:23

看起来奔腾FPU有正弦和余弦(fsin和fcos)的本机指令,但没有反弦指令。因此,我看到的__CIasin函数可能是.NET实现的,我知道它使用的是泰勒级数。这解释了速度上的巨大差异,因此asin出现了,而sin没有出现。(或者cos或sqrt -这些也是本机函数)。

我很久以前就已经直接编写了x86 FPU。很久以前,我想它一定是一个8087 --不管怎么说,那个时候唯一存在的触发器就是一个部分切线!

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

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

票数 1
EN

Stack Overflow用户

发布于 2010-11-09 04:27:09

是的,一定要解开sqrt和arc。反三角函数几乎总是比它们的正向对应函数慢,因为正向三角函数通常在FPU中实现。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3979953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档