ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바 Switch 문 vs If else 문 성능 비교
    Java&Spring/Java 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 문을 "잘" 구현하자 -> 예외 처리에 따라 생각 보다 느릴 수 가 있다.

     

     

Designed by Tistory.