【问题标题】:Does acos, atan functions in stl uses lots of cpu cyclesstl中的acos,atan函数是否使用大量cpu周期
【发布时间】:2023-04-04 03:19:01
【问题描述】:

我想计算两个向量之间的角度,但我已经看到这些逆触发操作(例如 acos 和 atan)使用大量 cpu 周期。有没有一种方法可以在不使用这些函数的情况下完成这个计算?另外,当您进行优化时,这些真的会打动您吗?

【问题讨论】:

  • 你确定你需要原始角度吗?是的,根据我的经验,即使在现代 CPU 和高优化设置上,三角函数也非常缓慢。发布您要解决的完整问题,我们可以告诉您是否可以使用点/叉积代替。

标签: c++ optimization math


【解决方案1】:

STL 中没有这样的函数;那些在数学图书馆里。

另外,您确定在这里保持高效很重要吗?你有没有分析过热点是否有这样的函数调用?你知道使用这些功能时性能很差吗?在深入研究此类微优化之前,您应该始终回答这些问题。

为了给建议,你打算用它做什么?它必须有多准确?

如果您需要高精度的实际角度,您可能无法做得更好。如果您需要它进行一些比较,您可以使用绝对值和点积来获得角度的余弦。如果您不需要精度,您可以这样做并使用 acos 查找表。如果您将它用作另一个计算的输入,您可能可以使用一些几何图形或三角恒等式来避免必须找到反余弦或反正切。

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

【讨论】:

  • +1 用于更正数学库的来源,并提及分析和精度。
  • ++ 没错,我喜欢使用点积的观点,尽管我想你想要角度的正弦来进行比较。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    Arccos Taylor series

    Arctan Taylor series

    【讨论】:

    • 这里还有其他人被 Wolfram Alpha 震撼了吗?什么都可以问!试试“空载的欧洲燕子的空速是多少?”。
    【解决方案4】:

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

    先试试这些:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多