ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • if-else VS switch
    CODING/JavaScript 2018. 10. 19. 13:20

    if-else문과 switch 둘 중 어느것을 써야 효율적인가.

    if-else문은 원하는 조건이 나올때까지 순차적으로 모든 경우를 비교하지만
    switch문은 jump-table을 사용해서 한번에 원하는 곳에 이동한다 

    그래서 if문은 조건문의 개수만큼 O(n)의 시간복잡도를 갖게 되어 성능에 단점이 있고,
    switch문은 case의 개수만큼 jump-table을 차지하므로 메모리에 단점이 있다.

    때문에 성능면에서만 보면.. switch문이 더 빨라서
    조건이 3개 이상일 경우에는 switch를 사용하는 것이 더 좋다는 얘기가 나온 듯.
    그렇지만 사실 그 차이는 컴파일러의 처리 속도에 따라 차이가 생기는 것이고
    요즘 컴파일러들이 워낙 우수하기 때문에 차이가 미비하다고 하다. 

    if-else 를 쓰든 switch 를 쓰든 (특별히 성능과 메모리의 이슈를 갖고 있지 않은 이상) 각자의 취향이 아닐까.
    내가 짠 코드를 다른 사람이 보기 쉽게 "가독성"을 높이는 쪽으로 선택해서 사용하면 될 것 같고.
    비교할 조건이 많을 경우에는 switch 문을 사용하는 것이 좋을 것 같다.


    C의 관점에서 if-else와 switch-case문의 차이점 참고 -> 보러가기
    .NET 의 경우 Switch 와 If-else Speed 포스팅 참고 -> 보러가기
    .if-else switch 성능 테스트 포스팅 참고 ->보러가기


    sooasooa's comment 
    switch의 경우 순차적으로(1 2 3 4 또는 4 3 2 1) 써주면 메모리 관리에 좋다고 한다.
    jump table이 비교문이 3개 이하일 경우는 if else와 동일하게 작동한다는 얘기도 있는데 jump table은 컴파일러마다 다르게 작동한다고 한다.
    또한 현재와 같은 고성능(?) 환경에서 if 와 switch의 구문 사용에 따른 성능차이는 미미하기 때문에 가독성이 좋은 것을 택하는것도 한 방법이다.

    edina's comment
    ECMAScript 표준에 의하면 case 다음에는 이의의 표현식이 올 수 있다. 바로 이 점이 정수형태의 표현식만 사용하는 C, C++, 자바의 switch문과 큰 차이가 있다. 
    case 의 조건이 정수 형태가 아닌 문자열이나 연산이 필요한 형태이면 대응하는 값을 찾을 때까지 case 문이 나열된 순서대로 각 case 표현식을 평가하므로 자바스크립트에서 switch의 성능 효과를 바란다면 case에 정수 형태의 표현식을 사용하는 것이 좋겠다.


    출처 :  초고속웹사이트구축    
    <if 구문>
    갖은 if문을 최적화 하는 방법
    1. if else를 사용할 때에는 가장 많이 실행되는 value를 첫 조건문부터 순서대로 넣어준다.
    2. if문 안에 다른 분기를 넣는다. 큰 구분으로 if else를 두고 내부에서 다시 if else로 분기하여 조항의 연산수를 줄인다 (조건이 많을수록 좋을듯..)
     
    <switch 구문>
    *장점 
    1.반환값 조건의 가독성이 좋다
    2. 복잡한 중첩 조건문을 사용하지 않고 여러 조건문을 하나로 처리함으로 여러 다른 조건 값에 대해 동일한 결과를 실행 할 수 있게 해준다

    *브라우저 별 switch
    파이어폭스는 스위치 구문을 매우 잘다루지만 기타 브라우저는 스위치 구문이 아래로 내려갈 수록 그 실행시간이 증가하게 된다. (하지만 그 실행시간은 if보다 작다)

    <배열 검색>
    var results = [result0 , result1, result2, ..., result10];
    return results[value];


    결론 > 가장 빠른 조건문들
    if구문 : 검사할 값이 두개 이하인 경우 , 특정 범위를 쉽게 구분할 수 있는 숫자를 이용할 경우
    switch 구문 : 두개 보다 많고 10개보다 적을 경우, 비선형 데이타와 같은 특정 범위가 없는 경우
    배열검색 : 10개이상의 값을 가지고 있는 경우 , 검색 조건이 특정한 동작이 아닌 하나의 값일 경우



    출처: http://wecansoar.tistory.com/27 [비상, 飛上 , soar]


    댓글

Designed by Tistory.