IT Share you

switch 문의 String이 해당 if-else 문보다 어떻게 더 효율적입니까?

shareyou 2020. 12. 4. 21:28
반응형

switch 문의 String이 해당 if-else 문보다 어떻게 더 효율적입니까?


Java 문서에 따르면

Java 컴파일러는 일반적으로 연결된 if-then-else 문보다 String 개체를 사용하는 switch 문에서 더 효율적인 바이트 코드를 생성합니다.

AFAIK 스위치의 문자열도 .equals()대소 문자를 구분하는 방식으로 내부적으로 사용합니다. 따라서 이러한 맥락에서 어떤 효율성을 의미합니까? 더 빠른 컴파일? 적은 바이트 코드? 더 나은 성능?


switch 문을 사용하면 같음보다 빠릅니다 (단지 몇 개의 문자열이있는 경우에만 눈에 띄게) . 일치 할 수있는 문자열의 하위 집합을 결정하기 위해 먼저 사용 hashCode하는 문자열을 사용하기 때문 switch입니다. 케이스 레이블에있는 둘 이상의 문자열이 동일한 hashCode를 갖는 경우 JVM은 순차적 호출을 수행 equals하며 케이스 레이블에 hashCode가있는 문자열이 하나만 있더라도 JVM equals은 케이스의 문자열을 확인 하기 위해 호출해야합니다. label은 실제로 switch 표현식의 것과 같습니다.

String 개체에 대한 스위치의 런타임 성능은 HashMap.

이 코드 조각 :

public static void main(String[] args) {
    String s = "Bar";
    switch (s) {
    case "Foo":
        System.out.println("Foo match");
        break;
    case "Bar":
        System.out.println("Bar match");
        break;
    }
}

다음 코드와 같이 내부적으로 컴파일되고 실행됩니다.

(말 그대로는 아니지만 두 코드를 모두 디 컴파일하면 똑같은 일련의 동작이 발생하는 것을 볼 수 있습니다.)

final static int FOO_HASHCODE = 70822; // "Foo".hashCode();
final static int BAR_HASHCODE = 66547; // "Bar".hashCode();

public static void main(String[] args) {
    String s = "Bar";
    switch (s.hashCode()) {
    case FOO_HASHCODE:
        if (s.equals("Foo"))
            System.out.println("Foo match");
        break;
    case BAR_HASHCODE:
        if (s.equals("Bar"))
            System.out.println("Bar match");
        break;
    }
}

일반적 으로 switch 문은 (느슨하게 말하면) 더 나은 O(1)반면 체인은 if-elseisO(n)

n조건이 있으면 n연결 if-else문을 사용하여 최대 비교 결과를 얻을 수 있습니다 .

switch 문은 적절한 조건 (예 :지도) 또는 기본 사례로 직접 "점프"하여 O(1).


이것은 문서의 예제에서 생성 된 바이트 코드 조각입니다.

 INVOKEVIRTUAL java/lang/String.hashCode ()I
    LOOKUPSWITCH
      -2049557543: L2
      -1984635600: L3
      -1807319568: L4

LOOKUPSWITCH를 사용하면 if-else 논리에 비해 성능이 더 좋습니다.

참고 URL : https://stackoverflow.com/questions/22110707/how-is-string-in-switch-statement-more-efficient-than-corresponding-if-else-stat

반응형