IOS/Swift: Cách sử dụng Lazy Sequences để tối ưu hoá performance app ios

by TanND18
454 views

Article overview

Nói về Lazy property chúng ta đã quá quen thuộc với lazy var, nhưng bạn đã bao giờ sử dụng lazy property vào sequences ? Bài viết này sẽ giúp các bạn cách sử dụng lazy vào các phép xử lý map, filter, reduce một cách hiệu quả và tối ưu hoá performance app ios.

Table of contents

Lazy Sequences là gì ?

Chúng ta cùng xem ví dụ sau, cho một collection mảng số nguyên từ 1 tới 1000, lọc mảng số nguyên chỉ lấy những giá trị là số chẵn, sau đó nhân đôi từng giá trị lên, rồi trả về kết quả giá trị đầu tiên value lớn hơn 10. Nếu không sử dụng lazy chúng ta có kết quả như sau:

Image of article

Nếu sử dụng lazy chúng ta sẽ có kết quả như sau:

Image of article

Chúng ta có thể thấy kết quả 2 bên đều = 12, nhưng có sự khác biệt lớn ở trường hợp không sử dụng lazy, phép xử lý filter chạy duyệt hết 1000 phần tử rồi tới phép xử lý map chạy tiếp và tương tự chạy 500 phần tử rồi mới tới phép xử lý tiếp theo. Nhưng nếu sử dụng lazy chúng ta thấy filter chỉ cần chạy 6 lần, map chỉ cần chạy 3 lần.

Ở trường hợp không sử dụng lazy chúng ta thấy phép xử lý phải chạy hết 1000 phần tử nhưng với điều kiện bài toán của chúng ta thì không cần thiết phải duyệt hết 1000 phần tử, lazy sẽ giúp chúng ta chạy song song các phép xử lý tức là khi filter chạy duyệt 1 phần tử chúng ta có được 1 kết quả của phép filter sau đó kết quả này sẽ dùng chạy tiếp cho phép xử lý map rồi đến first và cứ lặp lại như vậy khi có được kết quả thoả mãn điều kiện bài toán sẽ dừng lại không chạy tiếp. Ở ví dụ này thì chúng ta thấy con số tương đối nhỏ nhưng hãy tưởng tượng nếu chúng ta có một bài toán tương tự nhưng phạm vi mảng tới hơn 1 triệu thì lazy sẽ giúp chúng ta tối ưu rất nhiều số lần duyệt mảng từ đó hiệu suất ứng dụng app sẽ tốt hơn.

Nếu chúng ta có một collection ít phần tử thì việc sử dụng lazy cũng không mang lại tối ưu nhiều chính vì vậy chúng ta tránh lạm dụng lazy, chỉ nên sử dụng nếu chúng ta có một collection với nhiều phần tử.

Lazy collections không được cache lại, với lưu ý này chúng ta cùng xem ví dụ sau:

let modifiedLazyNumbers = (1...4)
    .filter { number in
        print("Even number filter")
        return number % 2 == 0
    }.map { number -> Int in
        print("Doubling the number")
        return number * 2
    }
    
print("Ket qua ne print lan 1: \(modifiedLazyNumbers.first!)")
print("Ket qua ne print lan 2: \(modifiedLazyNumbers.first!)")

// Even number filter
// Even number filter
// Even number filter
// Even number filter
// Doubling the number
// Doubling the number
// Ket qua ne print lan 1: 4
// Ket qua ne print lan 2: 4
let modifiedLazyNumbers = (1...4)
    .lazy
    .filter { number in
        print("Even number filter")
        return number % 2 == 0
    }.map { number -> Int in
        print("Doubling the number")
        return number * 2
    }
    
print("Ket qua ne print lan 1: \(modifiedLazyNumbers.first!)")
print("Ket qua ne print lan 2: \(modifiedLazyNumbers.first!)")

// Even number filter
// Even number filter
// Doubling the number
// Ket qua ne print lan 1: 4
// Even number filter
// Even number filter
// Doubling the number
// Ket qua ne print lan 2: 4

Các bạn có thể thấy sự khác nhau chính là vì lazy collection chỉ chạy các phép xử lý khi có request tới, chính vì vậy giá trị kết quả cuối cùng sẽ không được lưu ở output array, mỗi khi có request tới phép xử lý phải chạy lại.

  • Kết luận Chúng ta có thể thấy lazy collection mang lại hiệu quả tốt với performance nhưng chỉ nên áp dụng nếu chúng ta xử lý bài toán với phạm vi mảng lớn.

Authors

[email protected]

Leave a Comment

* By using this form you agree with the storage and handling of your data by this website.

You may also like