Search code examples
javaperformanceenumsif-statementpremature-optimization

Java: Performance of Enums vs. if-then-else


I've had no real luck getting a concise answer for this comparison by using Google and rather than do my own time consuming evaluations, I thought I would ask first.

I'm fairly sure that a switch statement using Enums would perform faster than an if-then-else statement, though whether or not it is a noticable difference is another question.

Could someone shed some light on this for me?


Thanks for the quick responses guys, I will keep this in mind for future projects.


Solution

  • Yeap, it does, because in general term a switch statement works faster than if/else chain.

    Although bytecode generated is not always definitive source for performance comparisons you can examine it to have a better idea.

    For instance this code:

    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(){}
    }
    

    Generates the following:

    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
    
    }
    

    Which seems to be pretty fast in both cases.

    So, pick the one that is easier to maintain.