如果使用OR AND vs多个If

时间:2015-02-17 07:06:11

标签: java performance

通常我们更喜欢使用

if(a==b || c==d) 

在我们的代码中。我遇到的情况是,我需要向用户提供有关确切错误的详细信息。所以我把它打破了

 if(a!=b) {
    doX();
    } 
    if(c!=d) {
    doY();
    }

从Java角度来看,这种变化会对性能产生什么影响?

1 个答案:

答案 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中的例程),您可以使用您喜欢的任何一个片段。