通常我们更喜欢使用
if(a==b || c==d)
在我们的代码中。我遇到的情况是,我需要向用户提供有关确切错误的详细信息。所以我把它打破了
if(a!=b) {
doX();
}
if(c!=d) {
doY();
}
从Java角度来看,这种变化会对性能产生什么影响?
答案 0 :(得分:3)
它取决于编译器(和优化器),但第一选择可能会更好:
(a == b) || (c == d)
可以作为一个整数算术公式(false == 0, true != 0
)
(a == b) + (c == d)
然后检查result > 0
是否正确。因此,只有一个条件检查和一个潜在的分支预测失败成本。要以这种方式 make 编译器,请将代码重新编写到
if ((a == b) | (c == d)) { // Note | instead of ||
...
}
在第二个片段中
if (a != b) {
if (c != d) {
...
}
}
两个条件检查和两个潜在的分支预测失败。 数据(从CPU到CPU的变化)是
comparison = 1/3..1 ticks
addition = 1/3..1 ticks
if = 1..20 ticks (20 if prediction appeared to be wrong)
在任何情况下,增益都是符号的,除非您必须在深循环中执行代码(在这种情况下,您可能更喜欢重写并积极优化C中的例程),您可以使用您喜欢的任何一个片段。