之间是否存在性能差异
if(array[i] == -1){
doThis();
}
else {
doThat();
}
和
if(array[i] != -1){
doThat();
}
else {
doThis();
}
当我现在已经只有一个元素(或通常很少的元素),其值为-1?
答案 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-else
,switch
语句会更快。