在某些情况下,有多种方法可以计算相同的值。
现在我想出一个算法来“扩展”2D凸多边形。为此,我想找到扰乱每个顶点的方向。为了产生使多边形具有相同厚度的“皮肤”的多边形扩展的结果,在该方向上扰动的量也取决于顶点处的角度。但是现在我只是担心方向。
一种方法是使用atan2:设B是我的顶点,A是前一个顶点,C是下一个顶点。我的方向是angle(B-A)
和angle(B-C)
的“角度平均值”。
另一种方法涉及sqrt:unit(B-A)+unit(B-C)
其中unit(X)
为X/length(X)
会产生一个带有我方向的向量。
我倾向于方法2,因为平均角度值需要一些工作。但我基本上是在两次调用atan2和两次调用sqrt之间做出选择。哪个一般更快?如果我在着色器程序中这样做呢?
我不打算优化我的程序本身,我想知道这些函数通常是如何实现的(例如在标准的c库中),所以我一般都能知道什么是更好的选择。
据我所知,sqrt和trig函数都需要迭代方法才能得出答案。这就是我们尽可能避免使用它们的原因。人们已经提出了“近似”函数,它们使用查找表和插值等来尝试产生更快的结果。我当然不会理会这些,除非我发现我的代码中存在瓶颈的严重证据,因为这些例程或例程严重涉及它们,但sqrt,trig funcs和inverse trig funcs之间的差异可能与讨论有关。
答案 0 :(得分:20)
在常见的现代硬件上使用典型的库,sqrt
比atan2
快。 atan2
速度较快的情况可能存在,但它们很少见。
最近的x86实现实际上具有相当高效的sqrt
指令,并且在该硬件上,差异可能非常大。英特尔优化手册在Sandybridge上引用单精度平方根作为14个周期,并且在22个周期内引用双精度平方根。有一个好的数学库atan2
时间通常在100个或更多周期附近。
答案 1 :(得分:1)
听起来您拥有所需的所有信息,可以自行分析并找到答案。
如果您没有寻找确切的结果,并且不介意使其工作所需的其他逻辑,您可以使用RSQRTSS
,RSQRTPS
等专门的操作来计算{ {1}},将两个昂贵的操作结合起来。
答案 2 :(得分:0)
实际上,sqrt优于atan2,1 / sqrt优于sqrt。
对于非内置解决方案,您可能会对CORDIC approximations感兴趣。
但是在你的情况下,你应该在得出任何结论之前开发完整的公式并对它们进行全局优化,因为超越函数只是计算的一小部分。