哪种表现更好?
我没有考试就问了这个问题,因为我很懒。现在,经过测试,它显示getMethod比.field略快。
Integer xj = x.getJ();` 或
Integer yj = x.j;下面是我去编译后的java字节码。
L5 {
aload1
invokevirtual testj/ByteCodeTest getJ(()Ljava/lang/Integer;);
astore4
}
L6 {
aload1
getfield testj/ByteCodeTest.j:java.lang.Integer
astore5
}下面是我正在测试的代码:
public void setPoint(){
point=System.currentTimeMillis();
System.out.println("point"+point);
}
public void comparePoint(){
long endPoint=System.currentTimeMillis();
System.out.println("endPoint"+endPoint);
System.out.println("inteval"+(endPoint-point));
}
int count =2000000000;
public void test22(){
ByteCodeTest x = new ByteCodeTest();
setPoint();
for(int i=0;i<count;i++){
int yy= x.i+1;
}
comparePoint();
setPoint();
for(int i=0;i<count;i++){
int yy=x.getI()+1;
}
comparePoint();
}下面是代码输出:
point1490454906205
endPoint1490454907447
inteval1242
point1490454907448
endPoint1490454908666
inteval1218这意味着getMethod略快于.field
发布于 2017-03-24 17:33:50
字段访问比方法调用更快,但是除非您在紧循环中编写对性能非常敏感的代码,否则使用其中一种的决定是设计,而不是性能。
将JIT添加到混合中,您可能不会从直接字段访问中获得任何优势。
测试表明方法调用更快,但这是因为您是not benchmarking correctly。性能是一个复杂的问题,初学者(甚至不是初学者)通常没有足够的经验来考虑所有的事情。他们不知道如何衡量性能,他们担心无关紧要的微观优化(在大多数软件中)根本不影响性能,他们不清楚JIT或其他正在发挥作用的东西,还有许多其他的问题,使得性能和缺乏经验的开发人员成为危险的组合。
发布于 2017-03-24 18:09:35
字节码是不同的,但最终,JIT将通过内联getter来优化访问。与编写代码时的程序员不同,JIT可以在任何时候准确地判断getter是否被覆盖。在这个问题上相信JIT,从长远来看,性能是相同的。
不一样的是可维护性。使用getter方法允许您用扩展/修改的逻辑覆盖getter (这样做的代价是使getter多态,导致较小的性能损失,另一方面,这在直接字段访问中甚至是不可能的)。
使用直接字段访问不会给您带来任何好处,但是在以后的代码发展过程中会有很多缺陷。
发布于 2017-03-24 17:32:53
当您使用getter时,您将调用一个降低性能的函数,而不仅仅是访问一个字段。如果您查看第一种情况下的字节代码,您应该会找到一个getJ的定义,在这里称为。
https://stackoverflow.com/questions/43005716
复制相似问题