c++ - 与不使用 if 的测试相比,if 语句的效率如何? (C++)

标签 c++ c if-statement micro-optimization

我需要一个程序来获取两个数字中较小的一个,我想知道是否使用标准“如果 x 小于 y”

int a, b, low;
if (a < b) low = a;
else low = b;

或多或少比这更有效:

int a, b, low;
low = b + ((a - b) & ((a - b) >> 31));

(或将 int delta = a - b 放在顶部并用它替换 a - b 的实例的变体。

我只是想知道其中哪一个更有效(或者如果差异太小以至于不相关),以及 if-else 语句与一般替代语句相比的效率。

最佳答案

(免责声明:以下内容涉及通常不需要的非常低级的优化。如果您继续阅读,则表示您放弃提示计算机速度快并且没有任何理由担心此类事情的权利.)

消除 if 语句的一个优点是可以避免分支预测惩罚。

分支预测惩罚通常只有在分支不容易预测时才会出现问题。当一个分支几乎总是被采用/不被采用,或者它遵循一个简单的模式时,它很容易被预测。例如,循环语句中的分支除了最后一个之外,每次都取,所以很容易预测。但是,如果您有类似的代码

a = random() % 10
if (a < 5)
  print "Less"
else
  print "Greater"

那么这个分支就不容易预测,并且会经常产生与清除缓存和回滚在分支的错误部分执行的指令相关的预测惩罚。

避免此类惩罚的一种方法是使用三元 (?:) 运算符。在简单的情况下,编译器会生成条件移动指令而不是分支。

所以

int a, b, low;
if (a < b) low = a;
else low = b;

变成

int a, b, low;
low = (a < b) ? a : b

在第二种情况下,不需要分支指令。此外,它比您的位旋转实现更清晰、更易读。

当然,这是一个微优化,不太可能对您的代码产生重大影响。

关于c++ - 与不使用 if 的测试相比,if 语句的效率如何? (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3009699/

相关文章:

c++ - 用于 if-else 的字符串和数字用户输入,接收错误

使用 %s 时无法访问数组的第一个下标,但可以使用 %c

c - fgets 的循环退出条件不起作用

javascript - 如何使用 jquery 使 2 个按钮切换 css 并仅使用 1 个按钮。不显示隐藏/显示

c++ - 在 C++ 中获取 Xcode 项目的资源

c - 此代码不会一直运行。我可能对端口有限制权限,但我不确定如何测试它

R错误if语句 'argument is of length zero'

c++ - 对 Qt 中的 doubleclickevent 和 mousepressevent 感到困惑

android - 以原生方式访问 mat 像素

c++ - 影响数字比较的双粒度c++