我想计算两个向量之间的角度,但我已经看到这些反向触发操作,如acos和atan使用了大量的cpu周期。有没有办法在不使用这些功能的情况下完成计算?此外,当您进行优化时,这些确实会让您受到影响吗?
答案 0 :(得分:10)
STL中没有这样的功能;这些都在数学库中。
另外,你确定在这里效率很重要吗?你有没有想过看看热点中是否有这样的功能调用?你知道使用这些功能时表现不好吗?在进行此类微观优化之前,您应该始终回答这些问题。
为了提供建议,你打算用它做什么?它有多准确?
如果您需要高精度的实际角度,您可能无法做得更好。如果需要进行比较,可以使用绝对值和点积来获得角度的余弦值。如果您不需要精度,则可以执行此操作并使用acos查找表。如果您将其用作另一个计算的输入,您可能可以使用一个小几何或可能是一个trig标识,以避免必须找到反余弦或反正切。
在任何情况下,一旦你完成了你要做的优化,在计时运行之前和之后做,看看你是否有任何显着的差异。
答案 1 :(得分:2)
这是完全实现定义的。当然,您可以使用第三方实现或近似,但首先您应该分析并确定您的瓶颈是什么。
答案 2 :(得分:2)
如果这些功能确实是瓶颈,并且您只需要近似值,则可以尝试使用这些函数Taylor series扩展的少数第一项。下一个未使用的术语的大小代表近似值中的误差。
答案 3 :(得分:1)
atan和acos的实现取决于编译器和优化设置。许多实现将使用表和插值来获得最接近的值。
首先尝试这些事情: