交换if / else条件时性能是否有差异?

时间:2014-01-26 13:12:00

标签: c performance if-statement

之间是否存在性能差异
if(array[i] == -1){
    doThis();
}
else {
    doThat();
}

if(array[i] != -1){
    doThat();
}
else {
    doThis();
}

当我现在已经只有一个元素(或通常很少的元素),其值为-1?

4 个答案:

答案 0 :(得分:7)

这完全取决于编译器如何选择优化它。你不能保证哪个更快。如果您确实需要向编译器提供提示,请查看Linux内核中的unlikely宏,这些宏由此定义:

#define likely(x)      __builtin_expect(!!(x), 1)
#define unlikely(x)    __builtin_expect(!!(x), 0)

这意味着您可以使用

if (likely(something)) { ... }

if (unlikely(something)) { ... }

详细信息:http://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html

道德:为了可读性而编写代码,而不是你认为编译器会如何优化它,因为你可能错了。

答案 1 :(得分:5)

编译器不会知道您的实际数据,因此它将产生大致相同的低级代码。

但是,假设if语句生成程序集分支和跳转,您的代码可能会在第二个版本中运行一点,因为如果您的值不是-1,那么您的代码将在下一个运行指令。在您的第一个版本中,代码需要跳转到新的指令地址,这可能代价很高,尤其是当您处理大量值(比如数百万)时。

答案 2 :(得分:5)

性能始终取决于实现。如果它对您来说足够重要,那么您需要在您的环境中对其进行基准测试。

话虽如此:可能没有区别,因为现代编译器可能会将两个版本转换为同样高效的机器代码。

可能导致差异的一件事是,如果不同的代码顺序改变了编译器的分支预测启发式。这有时会产生明显的差异。

答案 3 :(得分:0)

这取决于首先遇到的条件。因此,没有这么大的差异。

----->如果你必须测试很多语句,而不是使用嵌套的if-elseswitch语句会更快。