-
[WWDC24] Swift의 성능 살펴보기 (2 / 3)IOS/WWDC24 2025. 2. 8. 13:13
2024.12.07 - [IOS/WWDC24] - [WWDC24] Swift의 성능 살펴보기 (1 / 3)에 이어서 작성하는 글로 WWDC기반 영상을 분석하고 풀어낸 글입니다. 이번에는 메모리 할당 관련해서 설명하려 합니다.
https://developer.apple.com/wwdc24/10217
Explore Swift performance - WWDC24 - Videos - Apple Developer
Discover how Swift balances abstraction and performance. Learn what elements of performance to consider and how the Swift optimizer...
developer.apple.com
1. Memory allocation
해당 WWDC 영상에서 메모리 종류를 Global, Heap, Stack 3가지로 나타내어 각 영역에 따라 메모리 할당 비용을 말하고 있습니다.
- Global
- 프로그램 로드 시 할당되고 초기화되는 영역으로 해당 메모리를 사용하는 비용은 거의 없다시피 합니다. 주로 static 변수나 프로그램 전반적으로 할당되어 있는 전역 변수들이 해당하는 영역입니다.
- Stack
- 글로벌 메모리처럼 비용이 아주 적지만 메모리 범위가 한정적인 것, 즉 로컬 변수 할당에 적합합니다.
- Heap
- ARC 메커니즘이 적용된 영역으로 다른 종류 메모리에 비해 할당과 해제 시 많은 비용이 발생합니다.
2. Memory Layout
구조체(struct), 클래스(class), 또는 열거형(enum) 같은 데이터 타입이 메모리에 어떻게 배치되는지를 의미해. 즉, 해당 타입의 각 속성이 메모리에서 어떤 방식으로 할당되는지에 관한 주제입니다.
array = [1.0, 2.0]을 선언한 형태인데, 이를 딥하게 설명하면 다음과 같습니다.
- array는 Double형 타입의 배열의 시작주소를 가리키는 주소
- array는 배열 요소가 어떤 값이 담겨있는지 고려하지 않습니다.
또한 Array는 구조체로 정의되어 있습니다. (표준 라이브러리)
코드를 보면 하나의 변수 buffer 변수가 있습니다. 이 변수는 결국 클래스 레퍼런스(배열의 시작점)를 가리키는 단순한 포인터입니다.여기서 말하고 싶은 건, 배열을 사용해 메모리 할당의 경우 해당 범위에 속하는 지역변수, 중간 결괏값을 CallFrame(StackFrame)에 함께 저장이 될 텐데 그 값이 저장되는 게 아니라 실제 요소를 참고하고 있는 포인터가 저장됩니다.
이걸 왜 말하냐면, 값 타입(struct, tuple, enum)의 경우 힙 메모리를 참고하고 있는 게 아닌, 그 인스턴스에 있는 자체 값들이 메모리 영역에 할당되는데, 배열의 경우는 포인터가 저장됩니다. 즉, 타입에 따라 메모리가 다르게 할당된다는 걸 말씀 드리고 싶었습니다.
3. Value copying
해당 섹션에선 값 복사에 대한 설명과 Swift는 어떻게 효율적인 값 복사를 진행하고 있는지 말하고 있지만 아래 링크를 참고하는 것이 낫다 판단되어 첨부드리겠습니다.
https://bbiguduk.gitbook.io/swift/language-guide-1/automatic-reference-counting#arc-how-arc-works
자동 참조 카운팅 (Automatic Reference Counting) | Swift
객체의 라이프타임과 관계를 모델링합니다. Swift는 앱의 메모리 사용량을 추적하고 관리하기 위해 자동 참조 카운팅 (Automatic Reference Counting) (ARC)를 사용합니다. 대부분의 경우에 Swift에서 메모리
bbiguduk.gitbook.io
요약하자면 다음과 같습니다.
먼저 Swift는 Auto Reference Counting을 통해 참조 타입을 관리하고 있습니다. -> 이를 관리하는데 오버헤드가 발생
힙 메모리에 인스턴스가 할당되고 이를 참조하는 방식으로 메모리가 관리됩니다. 이는 큰 메모리 사용일 경우 효율적일 수 있지만, Reference counting 관리 리소스와 동시성 이슈가 발생할 가능성이 있습니다. 따라서 Switf는 값 타입 방식의 사용을 권장하고 있습니다.
값 타입의 경우 인라인 할당(메모리에 새로운 값 할당)을 통해 복사가 일어납니다. 하지만 메모리 사용이 큰 경우 잦은 복사가 일어나면 이것도 오버헤드일 수도 있지만, COW 방식을 사용해 최적화를 진행하고 있다 소개합니다. (String, Array, Dictionary)가 해당
COW방식은 String, Array, Dictionary의 값 복사가 발생할 때, 값 변경이 없다면 레퍼런스 주소를 참고하게 됩니다. 즉, 값 변경이 일어날 경우 인라인 할당이 발생하는 메커니즘입니다.
'IOS > WWDC24' 카테고리의 다른 글
[WWDC24] Swift의 성능 살펴보기 (1 / 3) (0) 2024.12.07 [WWDC19] Building Custom Views with SwiftUI Session, SwiftUI Layout 크기 메커니즘 알아보기 (2) 2024.09.21 [WWDC24] Translation API_한번에 여러 컴포넌트 번역하기 (0) 2024.09.14 [WWDC24] Translation API_소개 (3) 2024.09.08 - Global