Notice
Recent Posts
Recent Comments
Link
관리 메뉴

김종권의 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됨

소유권 개념

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로 감싸서 사용할때의 이점

 * 참고

 https://developer.apple.com/videos/play/wwdc2024/10217

Comments