오늘은 미루고 미루던 COW에 대해 좀 알아보려 한다.
COW란?
COW는 Copy On Write의 줄임말로.. "뭔가 쓸 때 복사를 한다"는 말이다.
뭔가 쓸 때 복사를 한다..
해당 개념은 Swift에만 국한되지 않고 대부분의 컴퓨터 프로그래밍에 사용이 되는데, 정확히 어떤 개념이냐면..
실제 원본이나 복사본이 수정되기 전까지는 복사가 이뤄지지 않고 원본을 공유하다가, 원본이나 복사본에서 수정이 일어날 경우, 그때 복사하는 작업을 한다.
여기서 원본을 공유한다는 것은 참조를 한다는 것이다.
그림으로 보면 아래와 같다.
이러한 작업은 Swift의 Collection Type을 복사하여 사용할 때 일어난다.
위의 그림에서도 사용한 배열 타입은 구조체로 이뤄져있고, 이는 값타입이기 때문에 값이 복사되어 할당되야 맞다.
하지만 수천, 수만개의 인덱스로 이뤄진 배열의 경우 인덱스당 메모리를 각각 차지하고 있는데, 이를 복사한다면 수천, 수만개의 메모리가 더 차지되고, 복사하는데 시간까지 소요되므로 메모리, 시간적으로 낭비가 상당할 것이다.
이러한 상황을 방지하기 위해 CoW를 사용하여!!! 값을 수정하지 않고, 그대로 갖다쓰는 경우엔 복사를 하는 것이 아닌 참조를 해 메모리, 시간낭비를 줄일 수 있게하였다.
이제 직접 테스트해보자
func address(of object: UnsafeRawPointer) -> String{
let address = Int(bitPattern: object)
return String(format: "%p", address)
}
먼저.. 주소값을 반환받기 위해 함수를 하나 만들어줬다. 아니 긁어왔다.
>UnsafeRawPointer: 저장된 값이 어떤 타입인지에 대한 정보가 없음, 즉 주소값만 가져올 수 있고 변수가 어떤 타입을 가지고있는지모름
출처: https://nsios.tistory.com/56 [NamS의 iOS일기]
위에서 설명한 것처럼 CoW로 인해 두 배열 모두 동일한 메모리에 위치하고 있는 모습을 볼 수 있다.
그럼 이제 둘 중 하나를 수정해보자
수정된 놈의 주소값이 변경됐다
수정되지 않은 배열은 주소값이 그대로네??
그럼 둘다 수정하면 어떻게 될까?
오 먼저 수정된 배열의 주소값이 변경된다!!
Swift는 이렇게 불필요한 복사를 줄여 성능을 보다 좋게 만들어준다.
의외로 간단하다
굿
'iOS > Swift' 카테고리의 다른 글
[Swift] Hashable (0) | 2022.05.02 |
---|---|
[Swift] Increasing Performance by Reducing Dynamic Dispatch (0) | 2022.04.22 |
Swift) self vs Self (0) | 2022.02.20 |
Swift) hitTest (0) | 2022.02.20 |
Swift) CoreData (0) | 2022.02.20 |
댓글