gpt4 book ai didi

java - Java中临时变量的效率

转载 作者:搜寻专家 更新时间:2023-11-01 04:03:00 25 4
gpt4 key购买 nike

我有课

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;
}
}
}

哪种编码方式更好?我在 B 类或 C 类中访问 x of A 的方式?

最佳答案

让我们看看它编译成什么。我编译

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;
}
}
}

得到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
}

对于 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
}

因为 C 只调用一次 getX 会更“高效”,因为这是那里最昂贵的东西。但是你真的不会注意到这一点。特别是 HotSpot JVM 将非常快速地“内联”此方法调用。

除非这是正在运行的代码的主要部分没有必要对此进行优化,因为您几乎不会注意到它。

但是,正如其他地方所提到的,除了性能之外还有其他原因为什么 C 方法更可取。一个明显的问题是 getX() 的结果是否在两次调用之间发生变化(在存在并发的情况下)。

关于java - Java中临时变量的效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17364000/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com