4 min to read
속도측정)if, switch 누가 더 빠를까?
속도측정
@
개발하다보면 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 까지도 나온다. 코드의 길이가 줄어든 대신 성능을 포기한다.. 어쨌든 코딩스타일에 대해 다시 생각해보는 재밌는 실험이었다.
Comments