Java是否优化了仅仅作为返回值的字段?

时间:2018-05-11 11:46:11

标签: java optimization jvm

为什么我要问:

我想知道在编译器端有任何优化会使一个或另一个方法返回更好。由于我已阅读this post,因此python不会优化方法以更快地运行。

示例:

我宣布了两种提供相同价值的方法。但是barA通过内部字段声明返回它。

public class Foo {
    public int barA(){
        int a = 1;
        return a;
    }

    public int barB(){
        return 1;
    }
}

测试:

public class TestFoo {
    Foo foo = new Foo();
    Method methodA = foo.getClass().getMethod("barA");
    Method methodB = foo.getClass().getMethod("barB");


    public TestFoo() throws NoSuchMethodException {
    }


    @Test
    public void methodA() throws Exception {
        assertTrue(Integer.TYPE.equals(methodA.getReturnType()));
    }

    @Test
    public void methodB() throws Exception {
        assertTrue(Integer.TYPE.equals(methodB.getReturnType()));
    }
    @Test
    public void equalsSame() throws Exception{
        assertEquals(foo.barA(), foo.barB());
    }
}

结果:

测试显示我实际上在两种方法中处理相同的值和返回类型。

声明: 这张图片并不是要强调秒表,junit为每种方法运行,因为它与我所询问的编译器优化无关。

The tests

问题:

Java是否真的试图优化掉#34;无用的"字段声明,以便更快地执行?

我无法找到解决此问题的问题。

是:

  • jdk 1.8.0_121
  • junit 4.10

1 个答案:

答案 0 :(得分:1)

如果我们举例:

class Main  {
    int foo() {
        int i = 0;
        return i;
    }

    int bar() {
        return 0;
    }

    public static void main(String[] args) {
        new Main().foo();
        new Main().bar();
    }
}

查看字节码:

class my.pckage.Main extends java.lang.Object{
my.pckage.Main();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

int foo();
  Code:
   0:   iconst_0  //push zero onto the stack
   1:   istore_1  //pop off the stack and store in local variable
   2:   iload_1   //load an int value from local variable 1
   3:   ireturn   //return an integer from a method

int bar();
  Code:
   0:   iconst_0
   1:   ireturn

public static void main(java.lang.String[])   throws java.lang.Exception;
  Code:
   0:   new     #2; //class my/pckage/Main
   3:   dup
   4:   invokespecial   #3; //Method "<init>":()V
   7:   invokevirtual   #4; //Method foo:()I
   10:  pop
   11:  new     #2; //class my/pckage/Main
   14:  dup
   15:  invokespecial   #3; //Method "<init>":()V
   18:  invokevirtual   #5; //Method bar:()I
   21:  pop
   22:  return

}

你可以看到它没有在这个级别进行优化。

关于JIT编译器是否决定在运行时优化它将取决于所针对的特定平台。