1. final과 private를 사용하자.
swift에는 Static Dispatch와 Dynamic Dispatch가 있다.
Dispatch란 어떤 프로퍼티나 함수를 호출할지를 결정하는 과정인데 Static과 Dynamic을 통하여 언제 실행을 할지를 결정한다.
|
Static Dispatch |
Dynamic Dispatch |
속도 |
빠름 |
느림 |
실행되는 위치 |
컴파일 타임 |
런 타임 |
사용하는 구조체(?)들 |
struct |
class |
쉽게 설명하자면 Class는 Dynamic Dispatch를 사용하고 그렇기에 성능이 Struct보다 저하된다고 생각하면 쉽다.
그렇다면 반대로 Static Dispatch를 사용해서 Class를 실행하면 속도가 빨라질텐데 어떻게 Static Dispatch를 사용할 수 있을까?
답은 상속을 허용하지 않는 Class 유형들이다.
첫번째 예시로 final이 있다.
Dynamic Dispatch를 Class가 사용하는 이유는 Class를 상속받으면서 동적으로 사용하기 위해서인데 final을 사용하는 Class는 상속을 허락하지 않는다는 옵션이기 때문에 자동적으로 Static Dispatch를 사용하게 된다.
두번째 방법은 private이나 fileprivate이다.
private나 fileprivate를 사용하면 외부에서 해당 클래스에 접근을 하지 못하게 되고 파일 내부에서 해당 클래스를 상속한 값이 없다면 자동적으로 Static Dispatch로 실행하게 된다.
2. 배열과 연결리스트 사이에서 고민을 해보자.
배열의 경우에는 조회를 할때는 O(1)이지만 삽입이나 삭제의 경우에 O(n) 이 걸리는 특성이 있다.
연결리스트의 경우에는 반대로 조회를 할때는 O(n)이 걸리지만 삽입이나 삭제에서 O(1)이 걸리는 특성이 있다.
클래스 내부에 만일 배열을 사용한다면 이와 같은 고민을 통해서 배열과 연결리스트 사이에서 고민을 하고 결정을 하자.
3. 모듈화를 가끔 양보하자.
가끔씩은 코드 내부에 있는 함수등을 따로 빼지 말고 안에다가 넣어서 실행해보자. 코드 외부로 빼는 것보다 속도 자체는 더 빠르다.
다만, 이와 같은 방법은 클린 코드와 성능을 교환한것이기에 개인적으로 추천을 하지 않는다.
출처 : https://www.linkedin.com/pulse/9-ways-boost-your-swift-code-performance-avi-tsadok/
https://velog.io/@wnsxor1993/Class%EC%9D%98-%EC%84%B1%EB%8A%A5-%ED%96%A5%EC%83%81-%EB%B0%A9%EB%B2%95
https://velog.io/@dvhuni/Reducing-Dynamic-Dispatch