我需要一个程序来获取两个数字中较小的一个,我想知道是否使用标准“如果 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/