Java嵌套if条件或同一if中的所有条件

Java嵌套if条件或同一if中的所有条件,java,optimization,Java,Optimization,我有一个循环迭代,它包含了这种形式的许多条件 if (a[k]<=x){ if(al[k+1]==y){ if(a[k+2]>=x){ } } } if(a[k]=x){ } } } 就性能而言,在单个if中使用条件是否更好 if ((a[k]<=x) && (al[k+1]==y) && (a[k+2]>=x)){ } if((a[k]=x)){ } 正如其他人所指出

我有一个循环迭代,它包含了这种形式的许多条件

if (a[k]<=x){
     if(al[k+1]==y){
         if(a[k+2]>=x){
         }
     }
}
if(a[k]=x){
}
}
}
就性能而言,在单个if中使用条件是否更好

 if ((a[k]<=x) && (al[k+1]==y) && (a[k+2]>=x)){


  }
if((a[k]=x)){
}

正如其他人所指出的,以可读性为目标,不要过早地优化代码。衡量性能,如果您发现这段代码是一个瓶颈,那么就开始认真考虑这个问题

同样如评论中所述,在这种情况下,性能可能相同。如果对谓词重新排序,可能会发现不同的性能特征。比如:

if(B && A && C)
如果计算A的成本很低,并且90%的时间返回false,而计算B的成本非常高,那么您可以改为编写:

if(A && B && C)

但同样,不要从臀部开枪!先瞄准可读代码,如果你的测量结果发现性能瓶颈,那么考虑上面的问题。

< P>实际上,编译器足够聪明,将这两个代码编译到同一字节码java,但是,如果你想我的意见,第一个更好(因为如果读了很多,如果是恼人的话)

如果你在循环中有很多复杂的条件,如你所说的,考虑将它们移到小方法中以提高可读性。

// inside loop
if (isValid(x, y, k)) {
}

// use a less generic method name in your code
private boolean isValid(int x, int y, int k) {
    return a[k]<=x && al[k+1]==y && a[k+2]>=x;
}
//内部循环
if(有效(x,y,k)){
}
//在代码中使用不太通用的方法名
私有布尔值有效(整数x,整数y,整数k){
返回a[k]=x;
}

如果您现在担心这会导致性能下降,那么JVM很有可能会内联这些方法。

您衡量了性能吗?对于一个好的编译器来说,同样地进行优化是微不足道的。这并不重要——追求可读性——使用你认为最可读的东西。性能可能是相同的。这是一种纳米优化,不太可能以可测量的方式影响性能。我建议您尽可能编写可读性最好的代码,在实际情况下分析代码,并且只有在数据告诉您应该重构时才进行重构。JVM使用统计信息在运行时进行优化;在计算如何快速运行时,它比您更聪明。那么您认为哪种形式更具可读性呢?我不确定Java是否适用,但我非常确定有很多此类优化。您可以在编译代码之前对其进行优化。