首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是java字节代码性能getfield vs invokevirtual?

什么是java字节代码性能getfield vs invokevirtual?
EN

Stack Overflow用户
提问于 2017-03-24 17:30:27
回答 3查看 329关注 0票数 1

哪种表现更好?

我没有考试就问了这个问题,因为我很懒。现在,经过测试,它显示getMethod比.field略快。

代码语言:javascript
复制
Integer xj = x.getJ();` 

代码语言:javascript
复制
Integer yj = x.j;

下面是我去编译后的java字节码。

代码语言:javascript
复制
 L5 {
     aload1
     invokevirtual testj/ByteCodeTest getJ(()Ljava/lang/Integer;);
     astore4
 }
 L6 {
     aload1
     getfield testj/ByteCodeTest.j:java.lang.Integer
     astore5
 }

下面是我正在测试的代码:

代码语言:javascript
复制
    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();
}

下面是代码输出:

代码语言:javascript
复制
point1490454906205

endPoint1490454907447

inteval1242

point1490454907448

endPoint1490454908666

inteval1218

这意味着getMethod略快于.field

EN

回答 3

Stack Overflow用户

发布于 2017-03-24 17:33:50

字段访问比方法调用更快,但是除非您在紧循环中编写对性能非常敏感的代码,否则使用其中一种的决定是设计,而不是性能。

将JIT添加到混合中,您可能不会从直接字段访问中获得任何优势。

测试表明方法调用更快,但这是因为您是not benchmarking correctly。性能是一个复杂的问题,初学者(甚至不是初学者)通常没有足够的经验来考虑所有的事情。他们不知道如何衡量性能,他们担心无关紧要的微观优化(在大多数软件中)根本不影响性能,他们不清楚JIT或其他正在发挥作用的东西,还有许多其他的问题,使得性能和缺乏经验的开发人员成为危险的组合。

票数 6
EN

Stack Overflow用户

发布于 2017-03-24 18:09:35

字节码是不同的,但最终,JIT将通过内联getter来优化访问。与编写代码时的程序员不同,JIT可以在任何时候准确地判断getter是否被覆盖。在这个问题上相信JIT,从长远来看,性能是相同的。

不一样的是可维护性。使用getter方法允许您用扩展/修改的逻辑覆盖getter (这样做的代价是使getter多态,导致较小的性能损失,另一方面,这在直接字段访问中甚至是不可能的)。

使用直接字段访问不会给您带来任何好处,但是在以后的代码发展过程中会有很多缺陷。

票数 4
EN

Stack Overflow用户

发布于 2017-03-24 17:32:53

当您使用getter时,您将调用一个降低性能的函数,而不仅仅是访问一个字段。如果您查看第一种情况下的字节代码,您应该会找到一个getJ的定义,在这里称为。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43005716

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档