12/08/2018, 16:48

Swift Performance Tips

Để tối ưu hoá một phần mềm, chúng ta cần hiểu hiệu suất cơ bản Bất cứ khi nào khởi tạo 1 object chung ta luôn đặt ra câu hỏi là: Trường hợp này nên được cấp phát trên Stack hay Heap . Stack là một cấu trúc dữ liệu đơn giản với 2 hoạt động chính là Push và Pop . Bạn có thể Push vào cuối ...

Để tối ưu hoá một phần mềm, chúng ta cần hiểu hiệu suất cơ bản

Bất cứ khi nào khởi tạo 1 object chung ta luôn đặt ra câu hỏi là: Trường hợp này nên được cấp phát trên Stack hay Heap. Stack là một cấu trúc dữ liệu đơn giản với 2 hoạt động chính là PushPop. Bạn có thể Push vào cuối StackPop từ cuối Stack bằng cách giữ một con trỏ trỏ vào cuối của Stack. Heap cho phép bạn cấp phát bộ nhớ động. Nó tìm kiếm các vùng nhớ chưa được sử dụng để cấp phát, và gắn lại các vùng nhớ để thu hồi. Heap quản lý Thread một cách an toàn. Như vậy rõ ràng là cấp phát trên Stack nhanh hơn Heap rất nhiều

Struct object được lưu trữ trên Stack, Class object được lưu trên Heap. Hãy nói về việc chung ta muốn cài đặt một đối tượng Person

struct Person {
  var age: Int = 20
}
let obj1 = Person()
let obj2 = obj1
class Person {
  var age: Int = 20
}
let obj1 = Person()
let obj2 = obj1

Cách nào sẽ nhanh hơn? Struct object được cấp phát trên Stack, Class object được cấp phát trên Heap. Heap sẽ tăng một reference counting đến class instance. Vì vậy trường hợp này, cấp phát trên Stack sẽ nhanh hơn Heap. Bây giờ chúng ta sẽ xem xét đối tượng Person phức tạp hơn.

struct Person {
var firstName: String
var middleName: String
var lastName: String
}
let obj1 = Person()
let obj2 = obj1
class Person {
var firstName: String
var middleName: String
var lastName: String
}
let obj1 = Person()
let obj2 = obj1

Vậy cái nào sẽ nhanh hơn? String là kiểu reference nên sẽ được lưu trên Heap tức là sẽ có 1 bản sao của Struct object trong mỗi trường hợp và có 2 lần cấp phát trên Heap cho kiểu String với nhiều hơn số reference counting. Vậy một lựa chọn thông minh là không làm điều này. Sử dụng Struct khi không có nhiều kiểu tham chiếu. Nếu không thì việc cấp phát và reference counting overhead sẽ mất nhiều hơn sử dụng Heap.

Điều tiếp theo, bạn muốn method của mình là tĩnh hay động. Dynamic dispatch sẽ tốn tài nguyên hơn nhưng đồng thời.

Sử dụng từ khoá private hoặc fileprivate để hạn chế khả năng hiện thị của khai báo trong file. Qua đó giúp trình biên dịch tự động loại bỏ các từ khoá không cần thiết để có hiệu năng tốt hơn

[nguồn]https://blog.usejournal.com/swift-performance-tips-55dc5688808b

0