WWDC16 Understanding Swift Performance (특강 내용정리 - 1)

JG Ahn·2025년 1월 8일

iOS

목록 보기
17/32
post-thumbnail

swift에서는 코드를 작성할 때 성능에 영향을 주는 요소가 크게 3가지가 있다.

1. Allocation - 할당

Stack

스택이 관리되는 방식은 매우 빠르고 간단하다. 만약 POP을 할 경우 실제로 메모리를 삭제하는 것이 아니라 포인터를 감소시킨다. PUSH가 된다면 포인터를 증가시키고 해당 메모리 위치에 값을 덮어씌운다.

  • 콜 스택 : 함수가 호출되면 그 함수의'스택 프레임'이 스택의 가장 위에 생성(PUSH)된다. 함수의 실행이 끝나면 스택에서 해제(POP)된다.
    • 스택 프레임 : 매개변수, 리턴주소, 로컬 변수

Heap

Heap 메모리에 할당하게 되면 오버헤드(성능 부하)가 있다. ① 런타임에 메모리를 할당하기 위해 Heap 메모리에서 할당되지 않은 빈 메모리 블럭을 찾아내야 한다. 이러한 과정에서 Heap의 여러 쓰레드가 접근 할 수 있는 특성 때문에 Race Condition이 발생 할 수 있다. 그렇기 때문에 ② 무결성을 위해 순차적으로 접근하도록 locking과 같은 병행제어를 해야한다.

💡 Race Condition : 여러 Thread가 하나의 자원에 동시에 접근해서 자원이 변질되어 원하는 결과가 나오지 않는 현상

Class가 Struct보다 비용이 더 필요한 예시)

// Class 예시
class Point {
    var x, y: Double
    func draw() { ... }
}

let point1 = Point(x: 0, y: 0)
let point2 = point1
poinrt2.x = 5

Stack에는 point1, point2의 주소값이 저장되고 Heap에 실제 값이 저장된다

클래스의 인스턴스가 Heap에 저장될 때는 추가적으로 2워드의 공간이 더 필요하다.

  • 2워드
    • type 필드 : 실제 Type을 저장하는 이유 - 상속이 가능하기 때문(다형성)
    • refCount 필드 : 카운트가 0이 되면 Heap을 lock하고 반환


💡타입을 저장하는 사례 : UICollectionView의 register에서 첫 번째 매개변수로 AnyClass라는 타입이 사용됨


AnyClass는 Type 이라는 타입. 타입을 저장 할 수 있다.

2. reference counting

Swift에서는 Heap에 저장된 인스턴스의 참조 카운트가 0이 될 경우 메모리 할당을 해제하며, 이러한 작업은 빈번하게 이루어진다.

Struct라고 하더라도 참조 카운팅을 안하는 것은 아니다. 예를 들면 Struct의 프로퍼티의 타입이 Class 타입이거나 String 타입이라면 참조 카운팅이 발생할 수 있다.

💡 String 타입은 기본적으로 값 타입. but, 문자열의 길이가 변할 수 있기 때문에 가변적인 크기의 메모리가 필요해 내부적으로 Heap 메모리에 저장된다.

3. Method Dispatch

0개의 댓글