Java&Spring/Java

자바 Switch 문 vs If else 문 성능 비교

sung.hyun.1204 2022. 9. 29. 20:52

두 함수 중 어느 것이 더빠를가?

public static void codeswitch() {
   String str1 = "C";
   switch (str1) {
      case "A":
         break;
      case "B":
         break;
      case "C":
         break;
   }
}
public static void ifelse()
{
   String str = "C";
   if ("A".equals(str)) {
   } else if ("B".equals(str))
   {
   } else if ("C".equals(str)) {
   }
}

답은 swtich 문이다.

Inttellij View show Byte code 를 보자

Byte code 를 보자

  public static codeswitch()V
   L0
    LINENUMBER 9 L0
    LDC "C"
    ASTORE 0
   L1
    LINENUMBER 10 L1
    ALOAD 0
    ASTORE 1
    ICONST_M1
    ISTORE 2
    ALOAD 1
    INVOKEVIRTUAL java/lang/String.hashCode ()I
    TABLESWITCH
      65: L2
      66: L3
      67: L4
      default: L5
   L2
   FRAME APPEND [java/lang/String java/lang/String I]
    ALOAD 1
    LDC "A"
    INVOKEVIRTUAL java/lang/String.equals (Ljava/lang/Object;)Z
    IFEQ L5
    ICONST_0
    ISTORE 2
    GOTO L5
   L3
   FRAME SAME
    ALOAD 1
    LDC "B"
    INVOKEVIRTUAL java/lang/String.equals (Ljava/lang/Object;)Z
    IFEQ L5
    ICONST_1
    ISTORE 2
    GOTO L5
   L4
   FRAME SAME
    ALOAD 1
    LDC "C"
    INVOKEVIRTUAL java/lang/String.equals (Ljava/lang/Object;)Z
    IFEQ L5
    ICONST_2
    ISTORE 2
   L5
   FRAME SAME
    ILOAD 2
    TABLESWITCH
      0: L6
      1: L7
      2: L8
      default: L8
   L6
    LINENUMBER 12 L6
   FRAME SAME
    GOTO L8
   L7
    LINENUMBER 14 L7
   FRAME SAME
    GOTO L8
   L8
    LINENUMBER 18 L8
   FRAME CHOP 2
    RETURN
   L9
    LOCALVARIABLE str1 Ljava/lang/String; L1 L9 0
    MAXSTACK = 2
    MAXLOCALS = 3

  // access flags 0x9
  public static ifelse()V
   L0
    LINENUMBER 21 L0
    LDC "C"
    ASTORE 0
   L1
    LINENUMBER 22 L1
    LDC "A"
    ALOAD 0
    INVOKEVIRTUAL java/lang/String.equals (Ljava/lang/Object;)Z
    IFEQ L2
    GOTO L3
   L2
    LINENUMBER 23 L2
   FRAME APPEND [java/lang/String]
    LDC "B"
    ALOAD 0
    INVOKEVIRTUAL java/lang/String.equals (Ljava/lang/Object;)Z
    IFEQ L4
    GOTO L3
   L4
    LINENUMBER 25 L4
   FRAME SAME
    LDC "C"
    ALOAD 0
    INVOKEVIRTUAL java/lang/String.equals (Ljava/lang/Object;)Z
    IFEQ L3
   L3
    LINENUMBER 27 L3
   FRAME SAME
    RETURN
   L5
    LOCALVARIABLE str Ljava/lang/String; L1 L5 0
    MAXSTACK = 2
    MAXLOCALS = 1

 

Switch 문에서는 table (Lookup)table 을 만들어 index 로 접근 하는데

if else 문의 겨우는 하나씩 비교하면서 내려온다.

 

본인 이 enum 을 사용할때 는 Switch 문을 "잘" 구현하자 -> 예외 처리에 따라 생각 보다 느릴 수 가 있다.