Ste*_* Lu 5 floating-point performance geometry
在某些情况下,有多种方法可以计算相同的值.
现在我想出一个算法来"扩展"2D凸多边形.为此,我想找到扰乱每个顶点的方向.为了产生使多边形具有相同厚度的"皮肤"的多边形扩展的结果,在该方向上扰动的量也取决于顶点处的角度.但是现在我只是担心方向.
一种方法是使用atan2:设B是我的顶点,A是前一个顶点,C是下一个顶点.我的方向是"角平均"的angle(B-A)和angle(B-C).
另一种方法涉及到开方:unit(B-A)+unit(B-C)这里unit(X)是X/length(X)产生与我的方向的矢量.
我倾向于方法2,因为平均角度值需要一些工作.但我基本上是在两次调用atan2和两次调用sqrt之间做出选择.哪个一般更快?如果我在着色器程序中这样做呢?
我不是试图优化我的程序本身,我想知道这些函数是如何通常实现的(例如在标准c库中),所以我一般都能知道什么是更好的选择.
据我所知,sqrt和trig函数都需要迭代方法才能得出答案.这就是我们尽可能避免使用它们的原因.人们已经提出了"近似"函数,它们使用查找表和插值等来尝试产生更快的结果.我当然不会理会这些,除非我发现我的代码中存在瓶颈的严重证据,因为这些例程或例程严重涉及它们,但sqrt,trig funcs和inverse trig funcs之间的差异可能与讨论有关.
Ste*_*non 21
在常见的现代硬件上使用典型的库,sqrt速度比atan2.情况下,atan2比较快可能存在,但他们却并不多见.
最近的x86实现实际上具有相当有效的sqrt指令,并且在该硬件上,差异可能非常显着.英特尔优化手册在Sandybridge上引用单精度平方根作为14个周期,并且在22个周期内引用双精度平方根.通过良好的数学库,atan2时序通常在100个周期或更多周期附近.