예시 코드
protocol CustomLoggable {
var customLogString: String
}
func log(value: Any) {
if let value = value as? CustomLoggable {
...
}
}
struct Event: CustomLoggable {
var name: String
var date: Date
var customLogString: String {
return "\\(self.name), on \\(self.date)"
}
}
let event = ...
log(value: event)
타입 체크 연산(as, is)는 가능하면 컴파일타임에 최적화되지만, 항상 가능한 건 아니여서 런타임에 일어날 수도 있다.
ARM 64에서 message send 호출을 12바이트 → 8바이트로 줄임
이 과정은 동일한 메소드를 호출해도 반복적으로 일어나는데, 이 selector 준비를 별도 메소드로 묶어준다.(헬퍼 함수)
msgSend도 한번 더 indirection해준다.
근데 이렇게 하면 크기는 줄지만 indirection이 두번 일어나니까 성능상으로 좋지 않다. 그래서 두개의 stub을 합쳐준다.
전체적으로 바이너리가 2% 정도 작아짐
Xcode 14로 빌드하면 적용됨 → 기존 OS에서 돌려도 적용되는 사항