algorithm - 这是获得数字绝对值的最快方法

标签 algorithm performance theory absolute-value

实现返回数字绝对值的操作的最快方法是什么?

x=root(x²)

if !isPositive(x):
    x=x*(-1)

实际上这个问题可以翻译成,if 有多快(以及为什么)。

我的大学编程教授总是告诉我要避免 if 因为它们非常慢,但我总是忘记问有多慢以及为什么。这里有人知道吗?

最佳答案

在不使用 if 语句的情况下计算 2s 补码整数的绝对值有一个绝妙的技巧。从理论上讲,如果值为负,则您希望切换这些位并加一,否则您希望按原样传递这些位。 XOR 1 恰好切换 A,A XOR 0 恰好保持 A 不变。所以你想做这样的事情:

  uint32_t temp = value >> 31;     // make a mask of the sign bit
  value ^= temp;                   // toggle the bits if value is negative
  value += temp & 1;               // add one if value was negative

原则上,只需三个汇编指令(无需分支)即可完成。并且您想认为通过 math.h 获得的 abs() 函数可以最佳地执行此操作。

没有分支 == 更好的性能。与@paxdiablo 上面的回复相反,这在深度管道中确实很重要,代码中的分支越多,分支预测器就越有可能出错并不得不回滚等。如果你避免分支在哪里有可能,事情会在你的核心中全速前进 :)。

关于algorithm - 这是获得数字绝对值的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/664852/

相关文章:

performance - Julia:快速文件动态写入

oracle - 将 InitialLOBFetchSize 与 EntityFramework 结合使用

programming-languages - "closure"和 "block"之间到底有什么区别?

haskell - 为什么FRP将时间作为值(value)的一个因素?

algorithm - NoSQL 或 YesSQL

java - 在我的寻路区域周围设置边界是否可以接受?

java - 从数组中计算可行的子列表长度

algorithm - 在矩阵中获得相邻 1 的最小翻转次数

performance - x86_64 - 自修改代码性能

optimization - 如何在优化方面做得更好?