Để tăng trải nghiệm của người dùng, khiến người dùng cảm thấy ứng dụng của chúng ta chạy nhanh hơn thì một trong những việc đó là giảm thời gian khởi động của chúng ta. Để người dùng có thể trải nghiệm tính năng chính một cách nhanh nhất.
Refer
- https://developer.apple.com/documentation/xcode/improving_your_app_s_performance/reducing_your_app_s_launch_time
- https://useyourloaf.com/blog/slow-app-startup-times
- WWDC 2016 Session 406 Optimizing App Startup Time
Lời mở dầu
Apple khuyến cáo chúng ta nên lập trình sao cho tổng thời gian khởi động ứng dụng dưới 400ms và bạn phải thực hiện trong vòng chưa đầy 20s nếu không muốn hệ thống tự dừng ứng dụng của bạn. Tuy nhiên thì vì nhiều lý do app chúng ta thường khởi động lâu hơn thế. Bên cạnh việc xử lý những tác vụ tiền khởi động ở trong AppDelegate thì chúng ta cũng cần phải biết cách debug việc khởi động chậm và biết được những gì đã xảy ra trước khi app chạy vào AppDelegate. Dưới đây là một số mẹo từ hội nghị WWDC 2016.
Pre-main time
Rất nhiều xảy ra trước khi hệ thống thực hiện chạy hàm main() của ứng dụng và gọi các hàm trong App Delegate như applicationWillFinishLaunching. Trước iOS 10, rất khó để chúng ta tìm hiểu tại sao một ứng dụng lại khởi động chậm vì những lí do khác ngoài code của bạn.
Hiện tại từ iOS chúng ta có thể làm việc đó dễ dàng hơn băng việc thêm DYLD_PRINT_STATISTICS = 1 vào trong Environment variables của project scheme
Chạy thử ứng dụng trên iPhone 8 ios 13 ta được kết quả như sau:
Khi kiểm tra việc khởi động chậm chúng ta nên chọn thiết bị chậm nhất mà ứng dụng hỗ trợ.
Kết quả cho chúng ta thấy tổng thời gian tính đến thời điểm hệ thông gọi hàm main() của ứng dụng theo sau đó là breakdown của các main steps.
Các bạn xem clip này để tìm hiểu sâu hơn WWDC 2016 Session 406 Optimizing App Startup Time
Dưới đây là một số lưu ý mà mình đã đúc kết từ các tài liệu và clip trên để cải thiện thời gian khởi động ứng dụng:
dylib loading time
dynamic loader có nhiệm vụ tìm và đọc các thư viện(dylibs) được ứng dụng sử dụng. Mỗi thư viện có thể có các phụ thuộc(Dependencies). Cơ chế load framework hệ thống của Apple là rất tối ưu, tuy nhên thì khi load những thư viện được nhúng vào ứng dụng của bạn thì lại không như vậy. Để tăng tốc các dylib thì Apple khuyến cáo bạn bên hạn chế sử dụng các thư viện bên ngoài hoặc gộp chúng lại với nhau làm một framework.
Rebase/binding time
Là khoảng thời gian ứng dụng rebale và binding các pointer.
- Ứng dụng chứa nhiều Objective-C class, selector hay category có thể tốn thêm thời gian cho việc khởi động ứng dụng.
- Để tăng tốc rebase/binding time bạn cần sử dụng ít các pointer fix-ups hơn.
- Nếu bạn sử dụng C++ thì nên sử dụng ít đi các virtual functions.
- Trong Swift sử dụng Struct cũng thường nhanh hơn
ObjC setup time
Objective-c runtime cần thiết lập một vài tác vụ cho việc đăng ký class, category và phân biệt các selector. Vì vậy bất kể những cải tiến nào bạn thực hiện để rebase/binding time cũng sẽ áp dụng cho thời gian thiết lập này.
Initializer time
Là lúc các hàm khởi tạo chạy, nếu bạn sử dụng phương thức Objective-C +load(deprecated) hãy thay thế nó bằng +initialize.
Các bạn cũng có thể sử dụng Instruments để theo dõi các chỉ số này.
Sau cùng thệ thống sẽ gọi hàm main() tiếp đến gọi UIApplicationMain() và các phương thức trong AppDelegate.
Loading framework làm tăng thời gian khởi động
Để kiểm chứng chúng ta cùng theo dõi thử nghiệm dưới đây:
Trước khi thêm thư viện:
Total pre-main time: 408.97 milliseconds (100.0%)
dylib loading time: 383.84 milliseconds (93.8%)
rebase/binding time: 7.86 milliseconds (1.9%)
ObjC setup time: 6.82 milliseconds (1.6%)
initializer time: 10.36 milliseconds (2.5%)
slowest intializers :
libSystem.B.dylib : 2.33 milliseconds (0.5%)
Sau khi thêm 10 thư viện Swift sử dụng Cocoapods
Total pre-main time: 682.90 milliseconds (100.0%)
dylib loading time: 631.17 milliseconds (92.4%)
rebase/binding time: 17.06 milliseconds (2.4%)
ObjC setup time: 17.47 milliseconds (2.5%)
initializer time: 17.09 milliseconds (2.5%)
slowest intializers :
libSystem.B.dylib : 6.05 milliseconds (0.8%)
Thời gian dylib loading time tăng lên từ 380ms đến 631ms. Các bạn có thể trực tiếp thử nghiệm trên chính ứng dụng của mình để thấy sự khác biệt.
Tổng kết
Bài viết trên mình đã chia sẻ cho các bạn về một số mẹo làm giảm thời gian khởi động ứng dụng. Giúp tăng trải nghiệm người dùng. Chúc các bạn thành công.