적당한 고통은 희열이다

- 댄 브라운 '다빈치 코드' 중에서

Swift iOS 앱 개발/Swift

[Swift] Class의 성능을 향상시킬 수 있는 방법

hongssup_ 2022. 12. 2. 21:34
반응형

성능에 영향을 미치는 3가지

Memory Allocation: Stack or Heap

Reference Counting: No or Yes

Method dispatch: Static or Dynamic (메서드를 호출할 때 

 

메모리를 할당할 때 스택에 

value type 의 특징

변수 할당 시 stack에 값 전체가 저장됨

다른 변수에 할당될 때 전체 값이 복사됨 (copy by value) -> 하나를 변경해도 다른 것에 영향 없음

Heap을 안 쓰며 따라서 Reference Counting도 필요 없음

 

Heap 할당의 문제

할당 시에 빈 곳을 찾고 관리하는 것은 복잡한 과정

무엇보다 그 과정이 thread safe 해야 한다는 점이 가장 큰 문제 (다른 스레드 끼리 충돌이 없어야 되기 때문에 lock 등의 동기화 동작 필요..?)

- lock 등의 synchronization 동작은 큰 성능 저하 요소

반면 Stack 할당은

- 단순히 스택 포인터 변수값만 바꿔주는 정도 (성능에 큰 영향 x)

 

Heap 할당 줄이기

 

String 구조체로 구현되어 있으며, 내부적으로는 메모리를 사용합니다. 이는 구조체의 빠른 속도와 안정성을 유지하면서도 문자열의 가변적인 크기를 지원하기 위함

Method Dispatch

: 메서드 호출 시 실행될 코드의 위치를 결정하는 프로세스를 말한다.

(Method Dispatch는 Swift에서 다형성 Polymorphism을 구현하는 데 필수적인 개념)

- Static Method Dispatch 정적 디스패치

: 컴파일러가 컴파일 시점에 메서드 호출 시 실행될 코드의 위치를 결정하는 디스패치 방식으로, 컴파일 시간에 결정되기 때문에 런타임 오버헤드가 없다.

이 방식은 클래스나 메서드가 final 로 선언되거나, private 일 경우에 사용된다.

- Dynamic Method Dispatch 동적 디스패치

: 런타임 시점에 메서드 호출 시 실행될 코드의 위치를 결정하는 디스패치 방식으로, 런타임 오버헤드가 있지만 메서드의 다형성을 구현하는 데 필요하다. 

이 방식은 메서드가 override 되었거나, 상위 클래스의 메서드가 하위 클래스에서 호출될 때 사용된다. 

 

 

 

 


참고 : youtube - Swift 성능 이해하기

728x90
반응형

'Swift iOS 앱 개발 > Swift' 카테고리의 다른 글

[Swift] Initialization + Convenience init 이란?  (0) 2022.12.08
[Swift] Copy On Write 동작 방식  (0) 2022.12.07
[Swift] Optional 옵셔널이란?  (0) 2022.12.01
[Swift] Codable - CodingKey  (0) 2022.11.24
oop vs pop  (0) 2022.11.17