좋은 조건문에 대해 2 - if/else문, switch/case문의 성능 차이
조건문에는 if / else 문도 있지만 switch / case 문도 있다.
개인적으로 이 둘의 '가독성' 차이는 별로 없다고 생각하여 개발자마다 취향 차이가 있을 뿐이라고 생각한다.
하지만, 위 주장은 조건문의 방법이 달라진다고 해서 '성능' 차이는 크게 발생하지 않는다는 전제가 있어야 한다.
💡 switch문
if-else문과 switch문 중 어떤 조건문이 성능적으로 좋은가를 찾아보니 switch-case문의 성능이 우수하다는 의견이 많았다.
그래서 swtich-case문의 성능을 한번 들여다 보기로 했다.
if-else문 과 switch문
if-else문은 원하는 조건이 나올 때 까지 순차적으로 모든 경우를 비교하지만,
switch문은 jump-table을 사용해 한 번에 원하는 곳에 이동한다.
if문 : branch statement 기반
switch문 : jump statement 기반
이러한 이유로 속도의 차이도 발생하는 것인가? 라는 물음이 생겨 1번, 100번, 10,000번으로 나누어 console.time문으로 체크해보니 시간상 차이는 없었다.
💡 switch문과 if문의 차이는 무엇이고 성능차이가 있는 걸까?
모든 switch문을 쓸 수 있는 경우는 전부 if문으로 대체 가능하지만, if문으로 가능한 것들 중 switch문으로 구현 불가능한 경우가 있다.
한 블로거님은 다음과 같이 표현해 주셨다.
pipeline 몇번째에서 분기(branch)판단일지, jump가 판단되는지, 점프하는 주소를 테이블에서 가져올수있는지, TLB에서 가져올수있는지, 테이블에 없다면 메모리에 접근해야하는지.. 등은 ISA(본인의 기준으로는 MIPS)에 따라 다르겠지만 그 기본적인 원리는 같으니 이해가 될 것이다.
특히나 점핑 테이블을 생성하는 `switch`문에서 유의할 점은, 상수가 아닐 경우는 점핑 테이블 생성을 할 경우 원하는만큼의 성능이 나오기란 힘드니, switch문을 변수로 사용하지 않는 가에 대한 의문에 답이 될 수 있다. 변수가 case에 들어가면 일반적인 if-else if 를 사용하는것이 더 좋다고 판단된다.
출처: https://pongsoyun.tistory.com/121 [palette]
if문
- branch 하는지 판단
- 실행을 할건지 말건지 판단
- 점프 테이블을 말드는데 걸리는 시간적 오버는 없으나, branch의 유무를 파악하기 위한 지침(instruction)이 지속적으로 필요
- 조건의 수가 적을수록 if문이 유리
switch문
- jump할건데 그 위치를 찾기
- 어떤 코드를 실행할 것인지 판단
- 조건에 만족하는지, 만족하지 않는지 판단이 아니라, switch문 시작 시 입력받은 값을 확인하는 지침(instruction)만 필요하다(점프테이블에서 해당 값으로 찾아기 때문). 하지만 점프테이블을 만드는 시간적 오버(오버헤드)가 존재한다.
- 조건의 수가 다양하고 많을수록 switch문을 쓰는 것이 유리
if문과 switch문은 이렇게 구조가 다르기 때문에 상황에 따라 유리한 경우가 다르다고 한다.
2021년이 녹아내려 벌써 끝이나고 새해가 밝았습니다.
블로그를 포스팅 하다보면 해당 주제에 대해 검색하고 공부를 우선적으로 해보는데, 그럴 때 마다 공부가 더 더 더 더 더 더어어어어어 많이 필요하다고 느끼게 되네요.
오늘도 지난 저의 게으름을 반성하며 내일 출근 준비를 하도록 하게쑴다.. 총총
감사합니다. 새해 복 많이 받으세요. 2022년 화이팅!
'Programming > Java' 카테고리의 다른 글
[Java] BigDecimal 사용법 및 예제 - 연산, 형변환, 비교 (0) | 2022.06.12 |
---|---|
[Java] StringBuilder는 무엇인가? - 사용법 및 사용하는 이유 (0) | 2022.01.09 |
[Java] 왜 좋은 조건문을 작성해야 할까? (0) | 2022.01.02 |
[Java] 상속을 사용하는 이유는 무엇일까? (2) | 2021.07.16 |
[Java] 자료구조 - 우선순위 큐(Priority Queue) & 힙(heap) 이란 무엇인가? (0) | 2021.05.28 |