티스토리 뷰

안녕하세요 Hani입니다.

이번에는 WWDC16에서 발표된 Understanding Swift Performance에 대하여 알아볼 거예요. ☺️

 

해당 토픽이 다루는 목차는 총 5개로 이루어져 있어요

1. Allocation

2. Reference Counting

3. Method Dispatch

4. Protocol Types

5. Generic Code

 

이번 포스팅에서는 Reference Counting에 대하여 다뤄보려고 합니다.

ARC는 참조 타입의 인스턴스가 참조될 때마다 Reference Count를 증가시키고

참조가 해제되면 Reference Count를 감소시켜서 카운트가 0이 되면 인스턴스를 메모리에서 할당 해제시키죠? ☺️

 

 

이 과정은 원자적(atomically)으로 일어나기 때문에 쓰레드 안정성이 보장됩니다.👍

 

 

그럼 ARC가 내부적으로 어떻게 돌아가는 지 알아보러 갈게욥.

Point 클래스로 인스턴스를 생성하고

point1, point2가 가리키고 있습니다.

 

 

사실은 이런 녀석들이 숨어있는 것 🦀

Reference Count는 인스턴스 안에 숨겨져 있고,

참조될 때마다 retain, 참조가 끝나면 release가 호출되어 결국 인스턴스가 사라집니다.

 

 

메모리랑 같이 살펴볼게요 🥰

일단 힙에 할당될 인스턴스를 가리킬 메모리를 할당하구

 

인스턴스 만든 다음에

 

만들어진 인스턴스를 point1가 가리킵니다.

Reference Count는 현재 1인 상태. 

 

point2도 인스턴스를 가리킵니다.

 

그리고 원자적으로 retain이 일어납니다.

카운트는 point1과 point2가 가리키니까 현재 2

 

 

다 쓴 point1은 이제 release하구

카운트 하나 내려감!

 

point2도 역할 끝났으니 release 합니다.

카운트는 0..

 

아무도 인스턴스를 가리키지 않으니까 힙 메모리의 할당 해제가 일어나구

 

스택 포인터도 다시 위로 올라갑니다.

 

 

오 쉣

그럼 힙 안 쓰려면 구조체로 도망가야겠다. 

 

 

노놉

구조체라도 힙을 안 쓰는 건 아님 🦀🦀🦀🦀

 

Label 구조체의 text 문자열과 UIFont 클래스는 힙 할당해야 함..

 

Label 인스턴스를 생성하면

프로퍼티들이 클래스이기 때문에 Point 클래스에서 했던 과정들이 여기서 일어납니다.

 

구조체를 완전히 복사할 것 같지만

사실은 Label1의 프로퍼티가 가리키는 힙 영역을 Label2의 프로퍼티도 참조하게 됩니다.

 

 

구조체의 Reference Count는 구조체가 들고 있는 레퍼런스의 개수에 비례해서 올라갑니다. 🥺 

이 때는 비용이 오히려 클래스보다 많이 드네요.

 

 

 

클래스랑 구조체의 성능을 비교해보면!

클래스는 힙 할당 + 레퍼런스 카운트도 있음 🥺

 

 

구조체는 스택에 할당되고

내부에 레퍼런스가 없는 경우는 레퍼런스 카운트가 없다 🥰

 

 

레퍼런스를 하나 포함하고 있다면 흠흠..

 

 

두 개 이상의 레퍼런스를 포함하고 있다면 🥺 🥺 🥺 🥺 🥺 🥺 🥺 🥺 🥺

 

 

 

구조체에서 레퍼런스를 최대한 줄여봅시다.

구조체가 3개의 레퍼런스를 들고 있네요.

 

 

요로케 바꾸면 fileURL만 구조체 내부에서 힙 할당이 일어나기 때문에 레퍼런스를 줄일 수 있습니다. 🥰

 


References

https://developer.apple.com/videos/play/wwdc2016/416/

 

댓글