욤찌의 개발 일기
[Swift] Class 성능 높이는거,, 그거 어떻게 하는건데,, 본문
이 얼마만의 블로그인가,,
그동안 게을렀던 과거의 나(사실 현재의 나도 ㅋ) 반성해,,
째뜬 이제는 더이상 물러날 곳이 없다,, 그래서 해본다 공부.
iOS 취준생들은 다 알고 있는 바로 이 iOSInterviewquestions를 한 번 파보기로 했다.
https://github.com/JeaSungLEE/iOSInterviewquestions
GitHub - JeaSungLEE/iOSInterviewquestions: 👨🏻💻👩🏻💻iOS 면접에 나올 질문들 총 정리
👨🏻💻👩🏻💻iOS 면접에 나올 질문들 총 정리 . Contribute to JeaSungLEE/iOSInterviewquestions development by creating an account on GitHub.
github.com
(JeaSungLEE 님 감사합니다,, 아무쪼록 늘 건강하시고 행복하셔요,,)
💡 class의 성능을 향상 시킬수 있는 방법들을 나열해보시오.
이 질문에 대한 답을 찾던 중 같은 조원 분이 좋은 글을 하나 보내주셨다.
https://developer.apple.com/swift/blog/?id=27
Increasing Performance by Reducing Dynamic Dispatch - Swift Blog
Get the latest news and helpful tips on the Swift programming language from the engineers who created it.
developer.apple.com
이 글은 class 의 동적 디스패치를 줄여서 성능을 높이는 방법에 대해 말하고 있다.
그런데 잠시만,,, 일단 ,, 동적 디스패치 ,,, 뭔데 ,, ,, 누군데 ,,,,,
디스패치란 무엇인가 (내가 아는 디스패치는 그 디스패치바께 없다,, 광광,,)
째뜬 완져니 초면인 개념들이라 이해하는데 시간이 오래 걸렸지만 일단 이해는 오나료!!!!!!
method dispatch -> Dynamic Dispatch -> 그래서 class 성능을 어떻게 높일건지!!!!!!
이해한대로 한번 쭈절쭈절해보쟈
1) Method Dispatch ? 누구세요 ?
디스패치는 일단 "보내다" 라는 뜻이 있쥬?
그렇다면 메서드 디스패치는 무엇이냐,,! 메서드를 보낸다는 뜻이겠쥬,,! 그럼 어떤 메서드를 보내줄 것인디?
그것이 바로 메서드 디스패치임다. 어떤 메서드를 보내줄지, 어떤 메서드를 호출할지를 결정하는 방식임
2) Static Dispatch ? Dynamic Dispatch ?
메서드를 보내주는 방식은 크게 두가지로 나눌 수 있다.
그것은 바로 Static Dispatch(정적 디스패치)와 Dynamic Dispatch(동적 디스패치)임.
이름에서도 알 수 있듯이 정적 디스패치는 아주 정-적으로 고정된 하나의 메서드를 전달한다.
즉, 어떤 메서드를 보내줄지 명확하다는 것! 그렇기 때문에 컴파일 시점에서도 알 수 있다.
그래서 컴파일 시점에서 어떤 메서드를 호출할 지 결정이 가능하고 그 결정대로 런타임때 고대로 실행이 가능하다.
그런데 동적 디스패치는 넘나 동~적~이다. 그래서 컴파일 시점에서는 어떤 메서드를 호출할지 알 수 없다.
3) 동적일수도 있찌 ㅠ 왜 컴파일 시점에 알 수 없는데여ㅠ
일단! 동적 디스패치와 정적 디스패치를 나누는 기준에 대해서 알아야 한다.
그것은 바로 상속! 더 정확하게는 method의 override(재정의) 가능성이다.
그래서 상속의 가능성이 있는 reference type과 상속의 가능성이 없는 value type의 메서드 디스패치가 다르다.
4) 값 타입 VS 참조 타입 : 각각의 Method Dispatch
값 타입의 구조체와 열거형은 상속의 가능성, 정확히는 메서드가 재정의 될 가능성이 없다.
그래서 메서드를 호출하게 되면 static dispatch의 방식으로 메서드를 호출한다.
상속을 하지 않으니까 하나밖에 없는 구조체와 열거형의 해당 메서드만 호출하면 된다. 고정된 바로 그! 메서드!
그러나 참조 타입인 class와 protocol 은 메서드가 재정의 될 가능성이 있다.
인스턴스가 어떤 클래스를 참조하고 있는지(어떤 클래스의 메서드를 호출하는지)를 컴파일러가 확인해야 하눈데
코드상으로는 어떤 클래스를 참조하는지 알 수가 없다,,!!!! 그럼 언제 알 수 있눈지???
바로바로 런타임 시점이 되어야 알 수 있다~~!~!
슈퍼클래스와 서브클래스의 상속관계에서 메서드를 오버라이드 할 때, 컴파일러는 상속 가능성을 대비해서
해당 인스턴스가 어떤 클래스의 메서드를 호출해야 하는지(어떤 클래스를 참조해야 하는지) 확인하는 작업을 런타임 시점에서 하는 것이다.
(이 부분은 virtual dispatch table 이라는 개념이 있던데,, 이건 더 공부를 해야겠음!)
5) 오 그럼 뭐가 더 좋은거여?
성능적인 측면으로 보았을 때, 컴파일 시점에서 어떤 메서드를 호출할지 이미 결정이 되는 정적 디스패치가
동적 디스패치보다 성능적으로 우위에 있다고 본다.
그래서 오늘의 주제인 class 의 성능을 높이기 위해 이 부분을 고려해본 것이 아닐까..!!!!!!
그렇다면 정적 디스패치가 동적 디스패치보다 좋은 것일까? 그것은 또 아니다.
성능적인 측면에서는 정적 디스패치가 더 좋지만,
동적 디스패치는 객체 지향 프로그래밍의 특징인 다형성을 구현하는 기능이라고 볼 수 있다.
성능적으로는 떨어질 수 있어도 각 상황에 맞는 메서드를 호출할 수 있게 해주니까 좀 더 유연성을 갖게 된다.
그래서 잊은 줄 알았지만 사실은 기억하고 있었던 !!!! class의 성능을 향상시키기 위해서는 !!!!
class 의 메서드 디스패치를 컴파일 시점에 할 수 있게 해주면 되지 않을까?!?!? Static Dispatch 로!?!?!?!??
참고한 공식 블로그에서는 class 의 성능을 향상시키기 위한 방법 3가지를 제시한다.
1) 상속과 재정의 될 필요가 없는 요소들에 final 키워드를 붙이자
final 키워드를 붙여 클래스, 메서드, 프로퍼티의 상속과 재정의를 막게 되면
컴파일러가 “오 그러면 동적 디스패치 안함? ㅇㅋㅇㅋ 내가 바로 결정해줌~” 하면서 static dispatch 의 방식을 사용
2) private 키워드를 붙이자
private 키워드를 붙이게 되면 외부에서는 접근하지 못하게 되잖아유?
그래서 private 키워드를 붙여 선언하게 되면 자동적으로 해당 선언부에서만 접근할 수 있게되니까
컴파일러가 static dispatch 방식을 사용할 수 있게됨!
3) Whole Module Optimization (전체 모듈 최적화)를 사용해서 final을 추론해보자
Swift는 기본적으로 모듈의 파일들을 하나하나 컴파일 하지만 WMO를 활성화하면 모듈 전체를 한 번에 컴파일 할 수 있다.
그렇기 때문에 외부 모듈 접근이 가능한 경우를 제외하고 internal로 선언이 되었다면 final 추론이 가능해져서
static dispatch로 동작이 가능하다.
그동안 class에는 final을 붙이는게 좋다~ 변수에 private를 붙이는게 좋다~ 는 알았지만
왜 좋은건지 확실히 몰랐는데,, 이번 기회에 얼추 알게 되어서 넘 뿌듯허다~!
아직 확실히 이해한게 맞는지도 모르겠고 ,, 좀 더 공부는 해봐야될듯,,
잘못된 정보가 있다면 언 제 든 지 알 려 주 세 요 ♥️
📖 reference(늘 감사합니당) ♥️
https://www.swift.org/blog/whole-module-optimizations/
Whole-Module Optimization in Swift 3
Whole-module optimization is an optimization mode of the Swift compiler. The performance win of whole-module optimization heavily depends on the project, but it can be up to two or even five times.
www.swift.org
https://babbab2.tistory.com/143
Swift) Static Dispatch & Dynamic Dispatch (1/2)
안녕하세요 :) 소들입니다 제가 드디어 몇 주간 바빴던 현업을 마치고!!!! 여유로워져서!!!! 공부하고 싶은 내용이 생겨서 포스팅을 끄적여 봅니당 후훗 이번에 공부할 내용은 바로 Dispatch에 대한
babbab2.tistory.com
https://jeonyeohun.tistory.com/340
[Swift] Method Dispatch (1): Static Dispatch vs. Dynamic Dispatch
Method Dispatch 글을 시작하기 전에, Method Dispatch가 무엇인지에 대해 정리할 필요가 있겠네요. 공식적인 문서는 아니지만 구글에 Method Dispatch의 정의에 대해 검색을 해보면, 💡 how a program selects which
jeonyeohun.tistory.com
'Swift' 카테고리의 다른 글
[Swift] Any랑 AnyObject 공부했다. 근데 TypeCasting을 곁들인,,(1) (3) | 2023.11.03 |
---|---|
[Swift] 나는 그저 Convenience Initializers 가 알고싶었을 뿐인데,,~ (0) | 2023.11.01 |
[Swift] ARC(Auto Reference Counting) (2) (0) | 2023.07.17 |
[Swift] ARC(Auto Reference Counting) (1) (0) | 2023.07.16 |
[Swift] value type & reference type (구조체와 클래스) (0) | 2023.07.09 |