Java:Enums与if-then-else的表现

Fiz*_*uzz 9 java performance enums if-statement premature-optimization

我没有真正的运气,通过使用Google得到这个比较的简明答案,而不是做我自己耗时的评估,我想我会先问.

我很确定使用Enums的switch语句比if-then-else语句执行得更快,不管它是否是一个明显的区别是另一个问题.

有人可以为我解释一下吗?


感谢快速回复的人,我将在未来的项目中牢记这一点.

Osc*_*Ryz 8

是的,确实如此,因为一般而言,switch语句比if/else链更快.

虽然生成的字节码并不总是性能比较的明确来源,但您可以检查它以获得更好的想法.

例如这段代码:

class A { 
    enum N { ONE, TWO, THREE }
    void testSwitch( N e ) { 
        switch( e ) { 
            case ONE : x(); break;
            case TWO : x(); break;
            case THREE : x(); break;
        }
    }
    void testIf( Enum e ) { 
        if( e == N.ONE ) { x(); }
        else if( e == N.TWO ) { x(); }
        else if( e == N.THREE ) { x(); }
    }
    void x(){}
}
Run Code Online (Sandbox Code Playgroud)

生成以下内容:

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

void testSwitch(A$N);
  Code:
   0:   getstatic   #2; //Field A$1.$SwitchMap$A$N:[I
   3:   aload_1
   4:   invokevirtual   #3; //Method A$N.ordinal:()I
   7:   iaload
   8:   tableswitch{ //1 to 3
        1: 36;
        2: 43;
        3: 50;
        default: 54 }
   36:  aload_0
   37:  invokevirtual   #4; //Method x:()V
   40:  goto    54
   43:  aload_0
   44:  invokevirtual   #4; //Method x:()V
   47:  goto    54
   50:  aload_0
   51:  invokevirtual   #4; //Method x:()V
   54:  return

void testIf(java.lang.Enum);
  Code:
   0:   aload_1
   1:   getstatic   #5; //Field A$N.ONE:LA$N;
   4:   if_acmpne   14
   7:   aload_0
   8:   invokevirtual   #4; //Method x:()V
   11:  goto    39
   14:  aload_1
   15:  getstatic   #6; //Field A$N.TWO:LA$N;
   18:  if_acmpne   28
   21:  aload_0
   22:  invokevirtual   #4; //Method x:()V
   25:  goto    39
   28:  aload_1
   29:  getstatic   #7; //Field A$N.THREE:LA$N;
   32:  if_acmpne   39
   35:  aload_0
   36:  invokevirtual   #4; //Method x:()V
   39:  return

void x();
  Code:
   0:   return

}
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,这似乎都很快.

所以,选择一个更容易维护的.


Mik*_*man 7

只要坚持使用你能想到的最易读和最清晰的代码,我确信你已经在性能优化中失去了所有时间,同时寻找这个答案.像这样的微优化很少值得,并且很容易导致代码比需要的更复杂.