Java:在这里加入其他更快的东西?还是更好的练习?

zal*_*314 4 java optimization

在诸如下面的java片段中的那个情况下,使用else块来包围返回false与使用else块之后的更快或更好的做法是更快还是更好?

public boolean test(boolean var){
    if (var == true){
        return true;
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

相比

public boolean test(boolean var){
    if (var == true){
        return true;
    }else{
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

显然这是一个非常简单的例子,可以缩短为一行,但我的问题是是否有一个jvm优化使得在第二个片段中使用else块更有效,或者是否更好的练习,因为两个片段在逻辑上都是当量.到目前为止,我一直在使用第一个代码段,因为代码少了一点.

Chr*_*lan 13

我编译了两个示例,结果字节码相同:

  public boolean test(boolean var);
    0  iload_1 [var]
    1  ifeq 6
    4  iconst_1
    5  ireturn
    6  iconst_0
    7  ireturn
      Line numbers:
        [pc: 0, line: 5]
        [pc: 4, line: 6]
        [pc: 6, line: 8]
      Local variable table:
        [pc: 0, pc: 8] local: this index: 0 type: scratch.Else1
        [pc: 0, pc: 8] local: var index: 1 type: boolean

  public boolean test(boolean var);
    0  iload_1 [var]
    1  ifeq 6
    4  iconst_1
    5  ireturn
    6  iconst_0
    7  ireturn
      Line numbers:
        [pc: 0, line: 5]
        [pc: 4, line: 6]
        [pc: 6, line: 8]
      Local variable table:
        [pc: 0, pc: 8] local: this index: 0 type: scratch.Else2
        [pc: 0, pc: 8] local: var index: 1 type: boolean
Run Code Online (Sandbox Code Playgroud)

至于你应该使用哪一个?在这个人为的例子中,答案是响亮的.与行为匹配的最佳代码是:

public boolean test(boolean var){
    return var;
}
Run Code Online (Sandbox Code Playgroud)

鉴于"if {return} else {return}"与"if {return} return"的选择,我的答案通常是后者,因为我更喜欢缩进.但我认为这实际上取决于每个分支中的代码数量.更多其他代码指向后者,如果代码指向前者则更多.

  • + 1经验答案.现在哪一个_should_你使用?对您或对读取代码的其他人更有意义的那个. (2认同)

mws*_*ltn 6

它们完全一样.像这个现代编译器这样的小东西会为你优化,javac就是这样做的.考虑以下课程:

public class IsElseFaster {
    public boolean test1(boolean var) {
        if (var == true) {
            return true;
        }
        return false;
    }

    public boolean test2(boolean var) {
        if (var == true) {
            return true;
        } else {
            return false;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

复制并粘贴到您喜欢的编辑器中,编译javac.然后运行javap -c IsElseFaster 您将获得以下输出:

public boolean test1(boolean);

  Code:
   0:   iload_1
   1:   iconst_1
   2:   if_icmpne   7
   5:   iconst_1
   6:   ireturn
   7:   iconst_0
   8:   ireturn

public boolean test2(boolean);
  Code:
   0:   iload_1
   1:   iconst_1
   2:   if_icmpne   7
   5:   iconst_1
   6:   ireturn
   7:   iconst_0
   8:   ireturn
Run Code Online (Sandbox Code Playgroud)

正如您所看到的那样,到达.class文件时,方法完全相同.