Java if语句分支的性能测试

Java if语句分支的性能测试,java,performance,Java,Performance,以下各项之间的性能是否存在差异: public int method() { x = 1; if (x == 0) System.out.println("something"); return 1; } 及 正如您所注意到的,我在第二个示例中使用了else。我不知道分支返回是否比正常返回快。让我们看看jvm说明: 第一种方法是一个if分支: public int ifmethod(); 0 aload_0 [this] 1 iconst

以下各项之间的性能是否存在差异:

public int method()
{
    x = 1;
    if (x == 0)
       System.out.println("something");
    return 1;
}


正如您所注意到的,我在第二个示例中使用了
else
。我不知道分支返回是否比正常返回快。

让我们看看jvm说明:

第一种方法是一个if分支:

     public int ifmethod();
 0  aload_0 [this]
 1  iconst_1
 2  putfield ifperf.main.x : int [22]
 5  aload_0 [this]
 6  getfield ifperf.main.x : int [22]
 9  ifne 20
12  getstatic java.lang.System.out : java.io.PrintStream [24]
15  ldc <String "something"> [30]
17  invokevirtual java.io.PrintStream.println(java.lang.String) : void [32]
20  iconst_1
21  ireturn
public int-ifmethod();
0 aload_0[此]
1 iconst_1
2 putfield ifperf.main.x:int[22]
5 aload_0[此]
6 getfield ifperf.main.x:int[22]
9 ifne 20
12 getstatic java.lang.System.out:java.io.PrintStream[24]
15最不发达国家[30]
17 invokevirtual java.io.PrintStream.println(java.lang.String):void[32]
20 iconst_1
21我返回
使用else分支的第二种方法:

public int ifelsemethod();
 0  aload_0 [this]
 1  iconst_1
 2  putfield ifperf.main.x : int [22]
 5  aload_0 [this]
 6  getfield ifperf.main.x : int [22]
 9  ifne 23
12  getstatic java.lang.System.out : java.io.PrintStream [24]
15  ldc <String "something"> [30]
17  invokevirtual java.io.PrintStream.println(java.lang.String) : void [32]
20  goto 25
23  iconst_1
24  ireturn
25  bipush 7
27  ireturn
public int-ifelsemethod();
0 aload_0[此]
1 iconst_1
2 putfield ifperf.main.x:int[22]
5 aload_0[此]
6 getfield ifperf.main.x:int[22]
9 ifne 23
12 getstatic java.lang.System.out:java.io.PrintStream[24]
15最不发达国家[30]
17 invokevirtual java.io.PrintStream.println(java.lang.String):void[32]
20转到25
23 iconst_1
24我返回
25双推7
27我返回
如您所见,在这种情况下,两种方法完全相同。答案是在第9行,你有测试ifne(“如果不等于转到XY行”),因此在一种情况下,你转到第20行,在第二种情况下转到第23行。然后执行完全相同的指令


因此,在一种情况下,您将执行0-9->20,21,而在另一种情况下,您可以比较两个示例中生成的字节码。通过这样的微优化,非常简单:如果您不知道,您就不需要它。知道的人会通过进行剖面分析来发现问题,并从中得出结论。他们这样做的原因是,事实证明这是一个应该解决的问题,不管问题有多小。这是一种直到你需要它时你才知道的东西,但当你需要它时,你就会知道。这不应该有什么区别。如果有可能的话,那将是微不足道的
public int ifelsemethod();
 0  aload_0 [this]
 1  iconst_1
 2  putfield ifperf.main.x : int [22]
 5  aload_0 [this]
 6  getfield ifperf.main.x : int [22]
 9  ifne 23
12  getstatic java.lang.System.out : java.io.PrintStream [24]
15  ldc <String "something"> [30]
17  invokevirtual java.io.PrintStream.println(java.lang.String) : void [32]
20  goto 25
23  iconst_1
24  ireturn
25  bipush 7
27  ireturn