Type Inference와 Type Annotation
Swift의 변수/상수를 선언하는 방법은 두 가지입니다.
컴파일러가 타입을 정해주는 방법과
개발자가 직접 타입을 작성해주는 방법입니다.
컴파일러가 타입을 정해주는 것은 타입 추론(Type Inference),
개발자가 타입을 작성하는 방법을 타입 명시(Type Annotation)라고 하는데요.
아마 많은 분들이 이미 Type Annotation을 사용하는게
성능이 더 좋다는 것은 알고 계실 것입니다.
왜냐하면 컴파일러가 할 일을 개발자가 대신 해주니까요.
오늘은 Type Inference와 Type Annotation의 속도가
얼마나 차이가 나는지 직접 확인해보겠습니다.
추가로 이건 개인적으로 궁금한건데 ㅎ;;
Int, String, Array 등 타입별로 시간 차이가 나는지도 확인해봅시다.
속도 측정 방법
public func measureTime(_ closure: () -> ()) -> TimeInterval {
let startDate = Date()
closure()
return Date().timeIntervalSince(startDate)
}
속도 측정은 위 함수를 이용해
10000번씩 총 10번 반복해서 측정합니다.
마지막에 총 걸린 시간과 평균을 출력해서 비교해볼게요.
속도 비교
Int
가장 기본적인 타입인 Int로 먼저 테스트 해봅시다.
var inference: Double = 0
for _ in 0..<10 {
let inferenceTime = measureTime {
for _ in 0..<100000 {
let _ = 1
}
}
inference += inferenceTime
}
var annotation: Double = 0
for _ in 0..<10 {
let annotationTime = measureTime {
for _ in 0..<100000 {
let _: Int = 1
}
}
annotation += annotationTime
}
둘의 차이점이라곤 annotation쪽에 :Int 로 타입 명시를 해줬다는 것 뿐이에요.
결과를 보면... 거의 차이가 나지 않아요.
심지어 가끔은 annotation이 느릴 때도 있었습니다.
그래서 선언뿐만 아니라 변수를 사용했을 때도 차이가 있을까 싶어
print()까지 추가해봤습니다.
오 ㅎㅎ 이제 확실히 차이가 나는군요.
그럼 다른 타입도 확인해볼까요?
String과 Array
String, Array도 상수를 선언하고 print로 찍는 것까지 측정했습니다.
String 결과입니다.
Int보다 차이가 더 커졌네요.
Array도 테스트 해보았는데요.
오히려 Annotation의 결과가 더 크게 나왔습니다. (여러 번 해도 거의 이럼)
이게 print를 안 하니 속도가 동일하게 나오는데
print까지 넣으니까 결과가 이렇네요..
print를 빼고 실행한 결과입니다.
평균적으로 Type Inference가 오래 걸리긴 하는데...
별로 차이가 없다고 보는게 타당할 것 같습니다.
개인적인 의견
Type Inference와 Type Annotation에 대한 의견은,
편한대로 쓰자입니다..
성능면에서는 분명 Annotation이 빠르게 나오지만
그 차이가 너무 미미해서 의미가 있을까? 라는 생각이 듭니다.
저는 Type Annotation을 애용하는 편입니다.
성능... 때문이 아니라 가독성 면에서요!
코드를 읽을 때 의심할 거리가 적은 코드를 좋아하는데요.
Type Annotation을 사용하면 타입이 명시적으로 나와있으니
나중에 코드 읽기가 더 편하더라고요.
또한,
리턴 타입이 여러 개인 메서드의 경우 타입을 지정할 수 있다는 장점도 있습니다.
대표적으로는 reversed() 인데요.
reversed()는 ReversedCollection과 [Int] 으로 리턴 타입이 두 개로 나뉘는데요.
let arr: [Int] = [1, 2, 3]
let reversed1 = arr.reversed()
print(type(of: reversed1)) //ReversedCollection<Array<Int>>
let reversed2: [Int] = arr.reversed()
print(type(of: reversed2)) //Array<Int>
이런 경우에 타입을 지정 안 하면 ReversedCollection 타입으로,
타입을 [Int]로 지정하면 [Int] 타입이 됩니다.
아무튼 결론은!
이런 저런 차이가 있으나
미미하니!
편한대로 쓰자!
입니다!!
감사합니다!
참고
https://docs.swift.org/swift-book/LanguageGuide/TheBasics.html
https://babbab2.tistory.com/14
https://babbab2.tistory.com/153?category=828998
아직은 초보 개발자입니다.
더 효율적인 코드 훈수 환영합니다!
공감과 댓글 부탁드립니다.