[WWDC2016] UnderStanding swift performance - Allocation #2
jcrescent61
started this conversation in
WWDC
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
참고 아티클 https://zeddios.tistory.com/596
Understanding swift performance
Swift의 성능을 알아보며 세가지 관점으로 판단할 수 있게 된다.
<- 오른쪽으로 갈 수록 성능은 저하되고, 왼쪽으로 갈 수록 성능은 좋아진다 ->
Allocation
Swift는 자동으로 메모리를 할당하고 해제하는데 메모리중 일부는 Stack에 해당된다.
Heap과 Stack에 관련된 내용은 해당 링크를 참고하자. (바로가기)
Struct
Point라는 구조체가 있다. x, y 변수와 draw()라는 메소드가 선언되어 있다.
point1에 Point 인스턴스를 만들어 넣고point2에point1을 복사하고point2의 프로퍼티에 5를 넣고있다.point1인스턴스와point2인스턴스에 대해 Stack에 공간을 할당했다.Point는 Struct이므로 Stack의 line에 저장된다.
이와 같이 Point인스턴스를 만들때 Stack에 이미 할당한 메모리를 초기화 하는 것 뿐이다.
point2에point1을 할당할 때 단지 해당point에 대한 복사본을 만들고 Stack상에 이미 할당한 메모리를 다시 초기화 한다. 즉,point1과point2는 독립적인 인스턴스이다.앞서 말한 것 과 같이
point2.x에 5을 할당해도 각각은 독립적인 인스턴스 이므로point1.x의 값은 변경되지 않는다.point1과point2를 사용하고 다 끝나게 되면 Stack 포인터를 점차적으로 증가시켜 쉽게 메모리를 해제할 수 있다.Class
위와 똑같은 코드를 Class로 만들어 보자.
이전에는 Struct였던 Point를 Class로 선언하고 프로퍼티와 메소드는 같다.
Stack의 경우와 다르게
point1과point2에 대한 레퍼런스를 위한 메모리가 할당되었다.Point 인스턴스를 만들면 Swift가 Heap을 lock하고 해당 크기의 메모리 블록을 검색한다.
class이기 때문에 x와 y를 저장할 공간 외에도 Swift가 관리하기 위한 공간을 더 할당한다고 한다.
struct과 다르게 point의 내용을 복사하지 않고 ‘레퍼런스’를 복사한다. 따라서 x의 값이 바뀌면 Point인스턴스 모든 값이 변경된다.
메모리 해제시 Heap을 lock하고 사용하지 않은 블록들을 적절한 위치로 재삽입한다고 한다. 그 후에 Stack을 Pop할 수 있다.
대충 보아도 Stack보다 Heap이 더욱 많은 비용이 드는 것을 알 수 있다. 따라서 Stack을 사용하는 것이 성능상 이점을 가져올 수 있다.
성능 개선하기
이런 코드가 있다고 가정해보자. enum case을 통해 여러가지 말풍선 모양을 만드는 코드이다.
makeBalloon 메소드가 빈번하게 호출된다고 가정하면 속도가 빨라야할 필요성이 있다.
그래서 딕셔너리로 cache를 만들었고 같은 말풍선을 한번 더 만들 필요 없게 구현했다. (중복이 없기 때문에)
이중에서 String 타입은 Heap할당이 되는 타입이다. String 데이터의 크기가 명확하지 않기 때문이라고 생각한다. 짧은 문자열이 될 수도 긴 문자열이 될 수도 있기 때문이다.
그래서 String 타입을 Attributes로 변경하고 이를 key로 사용했다.
이런 방식으로 구현하면 heap을 사용하지 않고 말풍선을 구현할 수 있게 되었다.
Beta Was this translation helpful? Give feedback.
All reactions