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

JHn*_*net 2 c performance if-statement

两者之间的表现是否存在差异

if(array[i] == -1){
    doThis();
}
else {
    doThat();
}
Run Code Online (Sandbox Code Playgroud)

if(array[i] != -1){
    doThat();
}
else {
    doThis();
}
Run Code Online (Sandbox Code Playgroud)

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

abl*_*igh 7

这完全取决于编译器如何选择优化它.你不能保证哪个更快.如果你真的需要给编译器提示,请查看unlikelyLinux内核中定义的宏:

#define likely(x)      __builtin_expect(!!(x), 1)
#define unlikely(x)    __builtin_expect(!!(x), 0)
Run Code Online (Sandbox Code Playgroud)

这意味着你可以使用

if (likely(something)) { ... }
Run Code Online (Sandbox Code Playgroud)

要么

if (unlikely(something)) { ... }
Run Code Online (Sandbox Code Playgroud)

详情请访问:http://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html

道德:编写您的代码以便于阅读,而不是您认为编译器会如何优化它,因为您可能会出错.


web*_*ter 5

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

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


mik*_*era 5

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

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

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