Copy-on-write란 컴퓨터 프로그래밍에서 리소스의 복제를 효율적으로 구현하기 위한 리소스 관리 기술로,
Swift에서는 Collection Type을 복사해서 사용할 때, Value Type의 성능을 최적화하기 위해 COW를 사용한다.
실제 수정이 이뤄질 때 값을 복사해서 메모리에 할당하고, 그 전에는 참조를 통해 불필요한 복사 및 메모리 사용을 줄이고자 하는 것.
Copy-On-Write (COW) 란?
Copy-on-write (COW), sometimes referred to as implicit sharing or shadowing, is a resource-management technique used in computer programming to efficiently implement a "duplicate" or "copy" operation on modifiable resources.
If a resource is duplicated but not modified, it is not necessary to create a new resource; the resource can be shared between the copy and the original. Modifications must still create a copy, hence the technique: the copy operation is deferred until the first write.
By sharing resources in this way, it is possible to significantly reduce the resource consumption of unmodified copies, while adding a small overhead to resource-modifying operations.
- wikipedia
컴퓨터 프로그래밍에서 수정 가능한 리소스에 대하여 복제 / 복사 작업을 효율적으로 구현하기 위한 리소스 관리 기술이다.
리소스가 복제 되더라도 수정되지 않은 경우에는, 굳이 새 리소스를 생성할 필요가 없다.
따라서 수정이 되기 전까지는 복사작업을 미루고 원본 리소스를 공유하고, 수정이 일어나면 그 때 복사하는 것
→ 수정 작업에 약간의 오버헤드를 추가하면서(?), 수정되지 않은 복사본들의 리소스를 크게 줄일 수 있다.
Swift에서의 COW 동작 방식
Swift에서는 Collection 등의 Value Type을 복사해서 사용할 때 COW를 사용한다.
ex) Array, Dictionary, Set
@frozen struct Array<Element>
@frozen struct Dictionary<Key, Value> where Key : Hashable
@frozen struct Set<Element> where Element : Hashable
위의 collection type들은 struct 구조체 형식으로, 다음과 같이 대입해주면 값 복사가 일어난다.
var array1: [Int] = [1,2,3,4]
var array2: [Int] = array1
메모리 주소를 찍어보면 다음과 같다.
값 복사가 일어나면 array2도 새로운 메모리를 할당해서 array1의 값을 복사해 가지고 있을 것 같지만,
cow 를 사용하여 array2는 array1의 값을 참조하고 있게 된다. (값이 저장된 메모리 주소가 동일)
둘 중 하나가 수정이 되기 전까지는!
그러다 둘 중 하나가 수정이 되면 그 때 실제 복사가 일어나서 array2 값이 새로운 메모리에 할당된다.
즉, 값을 복사하더라도 값을 복사한 시점이 아니라 원본 or 복사본 값이 수정(write)되는 시점에 실제 복제(copy)가 일어나 메모리에 할당이 된다는 것. → copy-on-write
COW 사용하는 이유?
실제 수정이 이뤄질 때 복사를 하고, 그 전엔 참조를 통해 불필요한 복사 및 메모리 사용을 줄이자!
* 상단 위키피디아 설명에도 나와있듯이, COW 를 사용하게 되면 값이 실제로 복사되는 첫번째 수정 작업을 할 때 시간이 조금 더 걸리고 약간의 오버헤드가 발생할 수 있다고 하지만 딱히 신경쓸 정도는 아니라고 한다.
참고 : Understanding Swift Copy on write Mechanisms, 개발자 소들이, naljin - value type 의 메모리 주소, github - High performance Swift code
'Swift iOS 앱 개발 > Swift' 카테고리의 다른 글
[Swift] Type Casting 타입 캐스팅 (0) | 2022.12.10 |
---|---|
[Swift] Initialization + Convenience init 이란? (0) | 2022.12.08 |
[Swift] Class의 성능을 향상시킬 수 있는 방법 (0) | 2022.12.02 |
[Swift] Optional 옵셔널이란? (0) | 2022.12.01 |
[Swift] Codable - CodingKey (0) | 2022.11.24 |