속도측정)if, switch 누가 더 빠를까?

속도측정

Featured image

@

개발하다보면 if, switch 둘의 구분이 애매할 때가 있다. switch로 구현해도 되고 if로 구현해도 되는 구문들이 있는데, 그럼 성능상으로 어떤 구문이 더 좋은 구문일까? 간단한 함수 하나를 구현하여 총 10000번을 호출했을 때 속도를 비교해 보고자 한다.

구현

구현한 함수는 숫자를 넣었을 때 요일을 반환하는 함수이다.

func weekToKorStr1(_ weekday:Int) -> String {
    var ret = ""
    switch weekday {
    case 1: ret = "일"
    case 2: ret = "월"
    case 3: ret = "화"
    case 4: ret = "수"
    case 5: ret = "목"
    case 6: ret = "금"
    case 7: ret = "토"
    default:break
    }
    return ret
}

func weekToKorStr2(_ weekday:Int) -> String {
    if weekday == 1 { return "월" }
    else if weekday == 2 { return "화" }
    else if weekday == 3 { return "수" }
    else if weekday == 4 { return "목" }
    else if weekday == 5 { return "금" }
    else if weekday == 6 { return "토" }
    else if weekday == 7 { return "일" }
    else { return "" }
}

둘의 차이점은 첫 번째 함수는 switch문을, 두 번째 함수는 if문을 사용했다는 것이 가장 큰 차이점일 것이다. 프로그래머의 코딩스타일에 따라 1번과 2번이 나뉘게 될 것다. 그렇다면 어떤게 더 좋은 성능을 발휘할까?

결과

결과는 놀랍게도 switch문인 첫 번째 함수가 0.5 ~ 0.8초가 소요되었고, if문인 두 번째 함수는 0.3 ~ 0.4가 소요되었다. 그렇다면 switch문보단 if문으로 구현하는게 더 좋은 성능을 보이는 것인가? 라고 생각했지만 혹시 switch문의 결과값을 담는 ret 변수가 성능을 느리게 하는 건 아닐까 라는 생각으로 제거 후 실행해보았다.

func weekToKorStr3(_ weekday:Int) -> String {
    switch weekday {
        case 1: return "일"
        case 2: return "월"
        case 3: return "화"
        case 4: return "수"
        case 5: return "목"
        case 6: return "금"
        case 7: return "토"
        default: return ""
    }
}

결과는 두 번째 함수와 비슷한 결과인 0.3 ~ 0.4정도 소요되었다. 따라서 if와 switch는 거의 성능이 같다고 봐도 무방하다.

결론

바로 리턴할 수 있다면 변수를 만들지 말고 리턴하는 것이 조금이나마 성능개선에 도움을 주는 것 같다.

번외

위의 함수 3개를 제외하고 다른 방법으로 더 짧게 구현할 수 있는데 이들의 성능은 어떨까?

func weekToKorStr4(_ weekday:Int) -> String {
    let arr = ["일", "월", "화", "수", "목", "금", "토"]
    if weekday <= 0 || weekday >= arr.count {
        return ""
    }
    return arr[weekday-1]
}

func weekToKorStr5(_ weekday:Int) -> String {
    let dic = [1:"일", 2:"월", 3:"화", 4:"수", 5:"목", 6:"금", 7:"토"]
    return dic[weekday] ?? ""
}

4번과 5번함수의 특징은 결과를 변수에 저장하고 불러오는 방법이다. 라인이 적은 것이 핵심이다. 이 함수들의 성능은 얼마나 나올까? 4번 함수는 1.6 ~ 1.8, 5번 함수는 4.2 ~ 5 까지도 나온다. 코드의 길이가 줄어든 대신 성능을 포기한다.. 어쨌든 코딩스타일에 대해 다시 생각해보는 재밌는 실험이었다.