Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- Xcode
- uiscrollview
- rxswift
- 리펙토링
- 리팩토링
- Human interface guide
- swift documentation
- uitableview
- Clean Code
- SWIFT
- collectionview
- Protocol
- Refactoring
- Observable
- clean architecture
- MVVM
- UITextView
- tableView
- map
- UICollectionView
- 스위프트
- HIG
- 애니메이션
- ribs
- swiftUI
- RxCocoa
- ios
- 리펙터링
- combine
- 클린 코드
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - Swift] 8. WWDC2024 정리 - (2) Explore Swift performance (Memory layout, Value copying, 소유권 개념, consume) 본문
WWDC 정리/WWDC 2024 정리
[iOS - Swift] 8. WWDC2024 정리 - (2) Explore Swift performance (Memory layout, Value copying, 소유권 개념, consume)
jake-kim 2024. 7. 8. 01:01낮은 수준의 성능을 야기하는 요소 4가지
- 1) Function call - 최적화 되지 않은 많은 함수 호출
- 2) Memory allocation - 메모리 할당에 너무 많은 시간을 소비
- 3) Memory layout - 데이터가 표현되는 방식 때문에 많은 시간이나 메모리 낭비
- 4) Value copying - 불필요하게 값을 복사하고 파괴하는데 많은 시간을 소비
* 1), 2)번 내용은 이전 포스팅 참고
3) Memory layout
- memory layout이란?
- 메모리를 할당한 후 해당 메모리를 사용하여 값을 저장하는 방법
- 메모리 에서의 representaion이라는 개념
- representation은 메모리 안에서 value를 어떻게 바라보는가를 의미
- 아래 코드에서 array는 메모리 관점에서 "두 개의 double 값 respresentaion으로 초기화된 buffer 객체에 대한 참조를 가지고 있는 메모리의 이름을 의미"
- inline representation이란?
- 어떤 포인터도 참조하지 않고 얻을 수 있는 것을 의미
- 메모리 관점에서는 이런 representation을 가지고 inline만 측정함
- 만약 아래처럼 작성하면, 두 개의 double 값 respresentaion으로 초기화된 buffer 객체에 대한 참조를 가지고 있고, 해당 버퍼에 실제로 포함된 내용은 무시한 후 표준 라이브러리의 MemoryLayout의 size는 단일 64bit 포인터 크기인 8byte로 측정됨
var array = [1.0, 2.0]
MemoryLauout.size(ofValue: array) == 8 // true
Value contexts 개념
(swift에서 logically하게 가지고 있는 문맥의 개념)
- local scope
- ex) local variables, intermeidate results of expressions
- instance context
- ex) non-static stored properties
- global context
- ex) global variables, static stored properties
- dynamic context
- ex) buffers managed by Array and Dictionary
inline storage와 out-of-line storage
- inline storages 개념
- 변수에 저장
- structs, enums, tuples과 같은 value-type을 저장
- out-of-line storage 개념
- 변수에 저장하지 않고 힙과 같은 영역에 저장하는 것
- class와 actor와 같은 타입을 저장
- inline preresentation은 객체의 pointer를 의미
- inline storage와 out-of-line storage의 가장 큰 차이점은 객체가 pointer를 가지고 있는지 유무인데, 이 차이가 성능에 큰 영향을 미침
- (이 원리를 이해하기 위해서 아래에서 소개할 Value copying 더 읽어보기)
4) Value copying
- Swift에는 소유권(Value ownership)이라는 개념이 존재
- 소유권이라는 의미는 해당 가치의 refresentation을 관리하는 책임을 의미
Value ownership 이해하기
- 아래처럼 배열의 inline representation은 buffer 객체에 대한 참조
- 이렇게 참조하고 있을 때, 이 변수의 범위가 벗어나게되면 buffer 객체에 대한 참조가 release됨
소유권 개념
- Value copying을 알기 전에는 swift의 개념인 소유권 개념 이해가 필수
- 소유권의 키워드는 consume, mutate, borrow가 있는데 이에 대한 메모리 관점에서의 이해하기 위해 소유권 개념 이해하기 (consume, mutate, borrow) 포스팅 글 참고
Mechanics of copying
- "값을 복사한다는 의미"
- 독립적인 소유권을 가진 새로운 inline representation을 얻기 위해, inline representation을 복사하는 것을 의미
- reference type의 경우, out-of-line storage 영역을 사용
- reference type 복사의 의미: "object reference를 복사한다" -> 참조의 소유권을 복사한다 (== 참조하는 객체를 유지한다)
- value type의 경우, inline storage 영역을 사용
- "구조체의 value"를 복사한다 -> 구조체에 저장된 속성을 모두 재귀적으로 복사한다
inline storage의 특성
- 힙에 메모리를 할당하지 않음
- 구조체 안에 프로퍼티 타입들이 조금 선언된 small types에서 높은 성능을 보임
- large types은 복사 작업을 많이 할 때 재귀적으로 지정된 속성을 모두 복사하므로 복사 비용이 높음
class 타입을 struct로 감싸서 사용할때의 이점
* 참고
'WWDC 정리 > WWDC 2024 정리' 카테고리의 다른 글
Comments