[F-Lab 모각코 챌린지] 43일차 - switch-case

F-Lab 모각코 챌린지 43일차 - switch-case 정리 입니다. JVM 에서 switch-case 를 최적화 하기 위해 어떤 전략들을 사용하고 있는지 소개합니다.

[F-Lab 모각코 챌린지] 43일차 - switch-case

switch-case

if-else 에 비해 switch 문은 좀 더 여러 가지의 최적화 기능을 제공한다

switch 문을 사용하면 어떤게 좋은가?

Jump Table

switch case 문에 포함된 case 의 값들을 테이블 형태로 정리하고, 작업을 수행 할 때 직접 jump 할 수 있게 한다.

따라서 조건을 평가하는 대신 테이블에서 인덱스를 참조하여 빠르게 이동 할 수 있다

예를 들어 아래와 같은 코드가 있다고 가정해보자.

switch (n) {
    case 1:
        doSomething();
        break;
    case 2:
        doSomethingElse();
        break;
    case 3:
        doAnotherThing();
        break;
    default:
        doDefaultThing();
}

이 때 Jump table 은 아래와 비슷하게 메모리에 구성된다

Case Function
1 doSomething()
2 doSomethingElse()
3 doAnotherThing()
default doDefaultThing()

그럼 코드에 접근 했을 때 (n) 을 인덱스로 취급하여 조회하면 바로 실행 결과가 나오게 되며 순서대로 비교 할 필요가 없게된다.

Jump Table 자세히

  1. 컴파일러 또는 인터프리터는 switch-case 문의 case 값을 분석한다.
  2. case 값을 key 로, case 에 대응하는 작업은 value 로 구성한다
  3. switch-case 로 넘어오는 인자값을 key로 접근하여 case 에 대응하는 작업으로 점프하여 바로 수행한다.

장점?

실행 속도 향상: 조건문을 평가하지 않고 테이블의 인덱스를 참조함으로서 선형적인 시간 복잡도를 가지게 된다.

단점?

Jump table 은 추가적인 메모리를 사용하여 테이블을 생성하기 때문에, 메모리 사용량이 증가할 수 있음. 메모리 제약이 있는 환경에서는 사용을 고려해야 한다.

최적화 조건?

연속적인 정수 값의 경우에만 적용 가능.

switch-case 에서 enum 이 평가조건으로 사용되는 경우, 최적화가 수행되는가?

Enum 에는 ordinal(서수) 값이 존재하여, ‘연속적인 정수 값’ 이라는 조건을 충족할 수 있음.

따라서 평가 조건(switch 에 전달되는 매개변수) 에 enum 을 사용하면 해당 조건을 충족하여 Jump table 이 수행됨.

조건 순서 최적화

switch-case 문의 case 를 가장 가능성이 높은 순서대로 배치함으로서 성능 최적화를 수행한다.

가장 가능성이 높은 조건은 가장 먼저 평가되어, 평가 조건의 수를 최소화 할 수 있다.

조건 순서 최적화

  • 빈도 평가: 특정 조건이 빈번하게 발생하는 경우 해당 기능에 대한 case 의 순서를 바꾸고 먼저 수행하도록 한다.
  • 우선순위 기반 평가: 특정 조건이 로직적인 우선순위를 가지는 경우, 해당 조건의 가능성이 높은 것으로 간주함.
  • 예측 가능성 기반 평가

if-else 로 변환

특정 switch-case 문이 복잡 할 경우, 컴파일러에 의해 효율적인 if-else 문으로 변경하여 최적화 한다.

패턴 최적화[java 17^]

(검색 키워드: switch-case pattern matching optimization in java)

Java 14 부터 추가 된 기능이지만 17 이상 부터 적용된 기능

일부 특수한 패턴을 가지고 있을 경우 (예를 들어, 연속된 정수 값) switch-case 문은 비트 마스크 연산을 사용하여 최적화를 수행함.