Java中临时变量的效率

Cha*_*har 3 java performance

我上课了

class A {
    private int x;
    public void setX(...){...}
    public int getX(){return x;}
}

class B {
    int y;
    public void setY() {
        //Accessing x of A, assume I already have object of A
        if(a.getX() < 0) {
             y = a.getX();
        }
    }
}

class C {
    int y;
    public void setY() {
        //Accessing x of A, assume I already have object of A
        int tmpX = a.getX();
        if(tmpX < 0) {
             y = tmpX;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

哪一个是更好的编码方式?我x of A在B级或C级访问的方式?

sel*_*lig 12

让我们来看看它编写的内容.我编译

class A {
    private int x;
    public void setX(int x_){x=x_;}
    public int getX(){return x;}
}

class B {
    int y;
    A a;
    public void setY() {
        //Accessing x of A, assume I already have object of A
        if(a.getX() < 0) {
             y = a.getX();
        }
    }
}

class C {
    int y;
    A a;
    public void setY() {
        //Accessing x of A, assume I already have object of A
        int tmpX = a.getX();
        if(tmpX < 0) {
             y = tmpX;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并获得B

  public void setY();
    Code:
       0: aload_0       
       1: getfield      #2                  // Field a:LA;
       4: invokevirtual #3                  // Method A.getX:()I
       7: ifge          21
      10: aload_0       
      11: aload_0       
      12: getfield      #2                  // Field a:LA;
      15: invokevirtual #3                  // Method A.getX:()I
      18: putfield      #4                  // Field y:I
      21: return        
}
Run Code Online (Sandbox Code Playgroud)

对于C.

  public void setY();
    Code:
       0: aload_0       
       1: getfield      #2                  // Field a:LA;
       4: invokevirtual #3                  // Method A.getX:()I
       7: istore_1      
       8: iload_1       
       9: ifge          17
      12: aload_0       
      13: iload_1       
      14: putfield      #4                  // Field y:I
      17: return        
}
Run Code Online (Sandbox Code Playgroud)

因为C只有getX一次它会更加"有效",因为这是最昂贵的东西.但是你真的不会注意到这一点.特别是当HotSpot JVM将"内联"此方法时,调用非常快.

除非这是运行代码的主要部分,否则 优化这一点是没有意义的因为您几乎没有注意到它.

然而,正如其他地方提到有其他原因无法表现为什么C方式是优选的.一个显而易见的问题是getX()两个调用之间的变化结果(存在并发性).

  • 嵌入式系统不使用热点 (2认同)