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-else
isO(n)
n
조건이 있으면 n
연결 if-else
문을 사용하여 최대 비교 결과를 얻을 수 있습니다 .
switch 문은 적절한 조건 (예 :지도) 또는 기본 사례로 직접 "점프"하여 O(1)
.
이것은 문서의 예제에서 생성 된 바이트 코드 조각입니다.
INVOKEVIRTUAL java/lang/String.hashCode ()I
LOOKUPSWITCH
-2049557543: L2
-1984635600: L3
-1807319568: L4
LOOKUPSWITCH를 사용하면 if-else 논리에 비해 성능이 더 좋습니다.
'IT Share you' 카테고리의 다른 글
Graphviz : 전체 그래프의 글꼴을 변경 하시겠습니까? (0) | 2020.12.04 |
---|---|
Vagrant 공유 및 동기화 폴더 (0) | 2020.12.04 |
반복 필드에 할당하는 방법은 무엇입니까? (0) | 2020.12.04 |
ES6 템플릿 리터럴 대 연결 문자열 (0) | 2020.12.04 |
원치 않는 위젯 빌드를 처리하는 방법은 무엇입니까? (0) | 2020.12.04 |