在stl中acos,atan函数是否使用了大量的cpu周期

时间:2010-06-01 21:30:30

标签: c++ optimization math

我想计算两个向量之间的角度,但我已经看到这些反向触发操作,如acos和atan使用了大量的cpu周期。有没有办法在不使用这些功能的情况下完成计算?此外,当您进行优化时,这些确实会让您受到影响吗?

4 个答案:

答案 0 :(得分:10)

STL中没有这样的功能;这些都在数学库中。

另外,你确定在这里效率很重要吗?你有没有想过看看热点中是否有这样的功能调用?你知道使用这些功能时表现不好吗?在进行此类微观优化之前,您应该始终回答这些问题。

为了提供建议,你打算用它做什么?它有多准确?

如果您需要高精度的实际角度,您可能无法做得更好。如果需要进行比较,可以使用绝对值和点积来获得角度的余弦值。如果您不需要精度,则可以执行此操作并使用acos查找表。如果您将其用作另一个计算的输入,您可能可以使用一个小几何或可能是一个trig标识,以避免必须找到反余弦或反正切。

在任何情况下,一旦你完成了你要做的优化,在计时运行之前和之后做,看看你是否有任何显着的差异。

答案 1 :(得分:2)

这是完全实现定义的。当然,您可以使用第三方实现或近似,但首先您应该分析并确定您的瓶颈是什么。

答案 2 :(得分:2)

如果这些功能确实是瓶颈,并且您只需要近似值,则可以尝试使用这些函数Taylor series扩展的少数第一项。下一个未使用的术语的大小代表近似值中的误差。

Arccos Taylor series

Arctan Taylor series

答案 3 :(得分:1)

atan和acos的实现取决于编译器和优化设置。许多实现将使用表和插值来获得最接近的值。

首先尝试这些事情:

  1. 分析应用程序以查找 大部分执行时间都在哪里 度过。
  2. 重新设计此区域以获得更好的效果 性能
  3. 考虑Data Driven Design 加速你的计划的技巧。
  4. 更改逻辑以减少分支和 if语句,考虑使用 Karnaugh maps简化 逻辑。