COW in Swift

Zeto·2022년 3월 2일
0

Swift_Study

목록 보기
3/18

Swift의 성능 향상 기술 중 하나인 COW!

"원본이나 복사본이 수정되기 전까지는 실제 복사가 이뤄지지 않고 원본의 리소스를 공유하며, 원본 혹은 복사본에서 수정이 발생하면 그때 실제 복사가 이뤄진다"

대문자로 쓰지 않으면 음메~하고 우는 친구와 구분이 안 되는 COW는 Copy-on-Write라는 용어의 약자로서 프로그래밍에서의 복사 동작을 설명한다. 특히 Swift에서는 원시타입 구조체(Int, Double 등)와 컬렉션 구조체(Array, Set, Dictionary)에 구현되어 있는 기술로서 복사 시의 성능을 향상시켜준다.

var arrayOne = [1, 2, 3, 4]
var arrayTwo = arrayOne

위의 코드의 경우, Array는 구조체 타입이므로 변수 arrayTwo에는 arrayOne의 값인 [1,2,3,4]가 할당되어 있어야 한다. 하지만 컬렉션 구조체에는 COW가 구현되어 있어 실제로는 arrayTwo에 아직 값이 할당되지 않았다. 오히려 참조 타입처럼 arrayOne을 참조하는 형태가 된다.

그럼 실제로 값이 복사되는 때는 언제일까?

var arrayOne[0] = 5

바로 위와 같이 원본 혹은 복사본에서 값의 수정이 이루어졌을 때! 드디어 고대하던 실제 복사가 이뤄지고 값이 할당된다.

굳이 이러는 이유가 뭔데?

솔직히 처음 COW라는 기술을 알게 되면 신기하긴 하지만 대체 왜 이래?라는 생각이 들 수 있다. 하지만 앞서 말했 듯이 해당 기술은 Swift의 성능 향상에 한 축을 맡고 있다.
왜냐? 작업을 하다보면 많은 복사를 하게 될 수 있는데 그때마다 무조건 수정을 하게 되는 것은 아니다. 즉, 수정이 없으면 실제 값이 복사되는 것이 아니므로 실제로 값이 복사됐을 때보다 메모리 사용이 줄어들게 된다. 결국 불필요하게 메모리를 잡아먹어 성능이 떨어지는 일을 방지할 수 있기 때문에 해당 기술을 사용하는 것이다.

물론 어떤 기술이든 장점만 있는 것은 아니고, COW 또한 첫 수정 시에는 복사 작업도 같이 이뤄지기 때문에 약간의 오버헤드가 발생되면서 작업 시간이 길어지게 된다. 하지만 실보다는 득이 크고 이런 작업 시간 차이도 가시적인 수준은 아니니 너무 신경 쓰지 않아도 될 것 같다.

추가적으로 사용자 정의 구조체에서는 COW가 구현되어 있지 않으므로 사용하고 싶으면 직접 구현해야 한다. 이 부분은 해당 포스트에 기술하지 않았으므로 필요하면 다른 능력자 분들의 글을 서칭하면 좋을 듯 하다.

profile
중2병도 iOS가 하고싶어

0개의 댓글