为什么我要问:
我想知道在编译器端有任何优化会使一个或另一个方法返回更好。由于我已阅读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为每种方法运行,因为它与我所询问的编译器优化无关。
问题:
Java是否真的试图优化掉#34;无用的"字段声明,以便更快地执行?
我无法找到解决此问题的问题。
是:
答案 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编译器是否决定在运行时优化它将取决于所针对的特定平台。