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 문이다.
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 문을 "잘" 구현하자 -> 예외 처리에 따라 생각 보다 느릴 수 가 있다.