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?
这完全取决于编译器如何选择优化它.你不能保证哪个更快.如果你真的需要给编译器提示,请查看unlikely
Linux内核中定义的宏:
#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
道德:编写您的代码以便于阅读,而不是您认为编译器会如何优化它,因为您可能会出错.
编译器不会知道您的实际数据,因此它将产生大致相同的低级代码.
但是,假设if语句生成程序集分支和跳转,则代码可能在第二个版本中运行得更快,因为如果您的值不是-1,那么您的代码将运行下一条指令.在您的第一个版本中,代码需要跳转到新的指令地址,这可能是昂贵的,尤其是当您处理大量值(比如数百万)时.
性能始终取决于实现.如果它对您来说足够重要,那么您需要在您的环境中对其进行基准测试.
话虽如此:可能没有区别,因为现代编译器可能会将两个版本转换为同样高效的机器代码.
可能导致差异的一件事是,如果不同的代码顺序改变了编译器的分支预测启发式.这有时会产生明显的差异.