bạn đã biết về Khái niệm “con Bò” chưa? Ý mình là COW trong swift…

PH Dong

Updated on:

Copy on Write (COW trong swift) là một khái niệm đã được Apple giới thiệu trong WWDC 2015 và được áp dụng từ iOS 7.0. Bây giờ chúng ta cùng tìm hiểu sâu hơn về nó.

Copy on Write (COW trong swift) là gì?

Đối với value Type trong Swift khi bạn gán một giá trị cho một biến hoặc chuyển nó dưới dạng tham số cho hàm (trừ khi đó là tham số đầu vào). Dữ liệu cơ bản của giá trị này sẽ được sao chép. Bạn sẽ có hai giá trị có cùng nội dung nhưng được phân bổ ở hai địa chỉ bộ nhớ riêng biệt, nó sẽ không là gì nếu chúng ta copy nó với số lượng nhiều, sẽ dẫn đến hiện tượng lãng phí hiệu năng và nó không tốt một chút nào.

Để giảm thiểu tình trạng này, Swift đã triển khai cơ chế Copy on Write cho một số kiểu dữ liệu là value type như Array, Dictionary,… Khi bạn thay đổi một bản sao của value type, Swift không thực sự sao chép giá trị ngay lập tức. Thay vào đó, nó giữ giá trị hiện tại chưa được thay đổi cho đến khi bạn cố gắng thay đổi nó. Khi có sự thay đổi, Swift sẽ tạo một bản sao của giá trị đó và thực hiện thay đổi trên bản sao đó.

Hiểu 1 cách đơn giản, nếu bạn có 1 array có 1000 phần tử và bạn muốn copy mảng đó vào 1 biến khác, Swift sẽ không sao chép ngay lập tức cả 1000 phần tử này mà sẽ sử dụng đến cơ chế Copy on Write: Khi bạn trỏ 2 biến vào cùng 1 mảng, chúng đều trỏ vào cùng 1 địa chỉ ô nhớ, và chỉ đến khi bạn sửa đổi 1 trong 2 biến đó, swift mới tạo ra 1 bản copy mới để sửa và chỉ sửa trên bản copy đó và vẫn giữ nguyên biến còn lại. Bằng cách trì hoãn việc sao chép dữ liệu cho đến khi thực sự cần thiết, Swift đã đảm bảo được việc tối ưu được performance của hệ thống.

Lưu ý về Copy on Write (COW trong swift):

  • Cop y on Write ko phải là cơ chế mặc định cho tất cả các kiểu Value Type, mà chỉ được áp dụng cho 1 số kiểu như Aray, Collections,… Ngoài ra, với những kiểu Value Type mà bạn tự custom thì cũng ko có sẵn cơ chế này mà phải tự implement thêm.

Dưới đây là ví dụ về cách hoạt động của COW trong swift:

Implement cơ chế Copy on Write cho các dạng value type tự tạo:

  • Bạn có thể tự mình implement cơ chế Copy on Write cho các kiểu dữ liệu mà bạn tự custom. Đây là ví dụ trên OptimizationTips.rst trong repo chính của Swift
final class Ref<T> {
  var val : T
  init(_ v : T) {val = v}
}

struct Box<T> {
    var ref : Ref<T>
    init(_ x : T) { ref = Ref(x) }

    var value: T {
        get { return ref.val }
        set {
          if (!isUniquelyReferencedNonObjC(&ref)) {
            ref = Ref(newValue)
            return
          }
          ref.val = newValue
        }
    }
}
// This code was an example taken from the swift repo doc file OptimizationTips 
// Link: https://github.com/apple/swift/blob/master/docs/OptimizationTips.rst#advice-use-copy-on-write-semantics-for-large-values
  • Đó là mã mẫu cho biết cách bạn sử dụng loại tham chiếu để triển khai tính năng sao chép khi ghi cho generic value type T. Về cơ bản, đó là một trình bao bọc quản lý loại tham chiếu và chỉ trả về một phiên bản mới nếu giá trị không được tham chiếu duy nhất. Nếu không, nó chỉ thay đổi giá trị của kiểu tham chiếu.

Kết luận:

  • Copy on Write là 1 cơ chế rất thông minh để tối ưu hoá việc copy giá trị của các kiểu value type. Đây là 1 cơ chế được sử dụng rất nhiều Swift, dù hầu như chúng ta ko nhìn thấy nó 1 cách rõ ràng vì chúng đã được thực hiện trên các thư viện chuẩn của Swift. Nhưng chúng ta nên biết để có thể tận dụng tối đa lợi ích mà Copy on Write mang lại.
Xem thêm: Multiple Thread là gì? Các loại Thread trong Swift

Viết một bình luận