Tính thời gian compile các method trong Swift để làm ngắn thời gian build
Thông thường thời gian build một project Swift mất khá nhiều thời gian. Vì vậy trong bài viết này, tác giả muốn giới thiệu đến bạn đọc một phương pháp tính thời gian build cho các hàm trong swift, để từ đó chúng ta có thể phát hiện các vấn đề -> sửa chúng để tối ưu hoá thời gian build cũng như ...
Thông thường thời gian build một project Swift mất khá nhiều thời gian. Vì vậy trong bài viết này, tác giả muốn giới thiệu đến bạn đọc một phương pháp tính thời gian build cho các hàm trong swift, để từ đó chúng ta có thể phát hiện các vấn đề -> sửa chúng để tối ưu hoá thời gian build cũng như tăng performance cho app
Tính toàn bộ thời gian build
Đầu tiên chúng ta cùng hiển thị thời gian build toàn bộ app bằng cách gõ dòng lệnh sau vào terminal của Mac:
defaults write com.apple.dt.Xcode ShowBuildOperationDuration YES
Khi chạy xong câu lệnh trên chúng ta hãy restart Xcode. Sau khi đã Product-> Clean và build lại -> thời gian buil sẽ hiện ra kiểu như bên dưới đây (ở đây project rất nhỏ nên thời gian build khá ngắn):
Khi chúng ta thấy thời gian build là khá dài mà không hiểu nguyên nhân do đâu thì đơn giản hơn ta sẽ hiển thị thời gian build cho từng method.
Tính toán thời gian dịch các file
để tính toán thời gian build các file trong project, chúng ta cần sử dụng công cụ xctool sau đó sử dụng Terminal di chuyển đến thư mục gốc chứa project của chúng ta và thực hiện dòng lệnh sau:
xctool -scheme SchemeName -jobs 1 clean build >> build.txt
Trong trường hợp sử dụng Workspace thì chúng ta thêm trường -workspace ProjectName.xcworkspace vào trong câu lệnh (SchemeName và ProjectName chính là tên của project chúng ta đặt)
Khi câu lệnh chạy hoàn thành sẽ tạo ra một file build.txt. Và ở trong file build.txt thời gian build từng file sẽ được ghi ra như dạng bên dưới:
~ Compile ViewController.swift (3314 ms) ~ Compile AppDelegate.swift (290 ms)
Đến đây thì chúng ta đã biết được thời gian compile của từng file là bao nhiêu rồi. Và còn chi tiết hơn nữa, chúng ta có thể tính được thời gian compile của từng method trong các file đó nữa
Tính thời gian compile trong các Method
Để tính toán thời gian compile của các Method và Properties thì đầu tiên, chúng ta cần settings ờ Xcode tại phần Build Settings -> Other Swift Flags: thêm dòng -Xfrontend -debug-time-function-bodies sau đó làm lần lượt với từng file
xctool -scheme SchemeName -jobs 1 clean build >> build_in_detail.txt
sau khi chạy command xong chúng ta sẽ có được thông tin như log bên dưới:
-------------------------------------------------------------------------------- ~ Compile ViewController.swift (513 ms) -------------------------------------------------------------------------------- 18.5ms /Users/username/Desktop/DurationSample/DurationSample/ViewController.swift:13:14 @objc get {} 0.1ms /Users/username/Desktop/DurationSample/DurationSample/ViewController.swift:13:14 @objc set {} 0.2ms /Users/username/Desktop/DurationSample/DurationSample/ViewController.swift:5:19 @objc override func viewDidLoad() 0.1ms /Users/username/Desktop/DurationSample/DurationSample/ViewController.swift:9:19 @objc override func didReceiveMemoryWarning() 12.5ms /Users/username/Desktop/DurationSample/DurationSample/ViewController.swift:17:10 @objc func createArray() 3.4ms /Users/username/Desktop/DurationSample/DurationSample/ViewController.swift:22:10 @objc func createDictionary() 0.0ms /Users/username/Desktop/DurationSample/DurationSample/ViewController.swift:3:7 @objc deinit 0.3ms /Users/username/Desktop/DurationSample/DurationSample/ViewController.swift:3:40 @objc @objc override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) 0.2ms /Users/username/Desktop/DurationSample/DurationSample/ViewController.swift:3:40 @objc @objc required override init?(coder aDecoder: NSCoder)
Và đó là kết quả thời gian compile của file dưới đây:
import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } lazy var strings: [String] = { return ["test"] }() func createArray() { let array = ["1", 2, 3.0, CGFloat(4.0)] print(array) } func createDictionary() { let dict = ["key1" : "1", "key2" : 2] print(dict) } }
Ở đây chúng ta có thể thấy 2 chỗ có thời gian build lớn hơn phần còn lại ko đáng kể đó là :
- Dòng 13 lazy var strings property mất 18.5ms
- dòng 17 Method createArray mất 12.5ms. Do đó chúng ta có thể rút ra nhật xét là nếu không set mảng theo kiểu type hinting này khá là mất thời gian.
Nếu sửa lại code như bên dưới đây (thêm type hinting vào ) và build lại:
import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } lazy var strings: [String] = { let result: [String] = ["test"] return result }() func createArray() { let array: [AnyObject] = ["1", 2, 3.0, CGFloat(4.0)] print(array) } func createDictionary() { let dict = ["key1" : "1", "key2" : 2] print(dict) } }
Và kết quả ở file log sẽ như dưới đây
-------------------------------------------------------------------------------- ~ Compile ViewController.swift (493 ms) -------------------------------------------------------------------------------- 1.3ms /Users/username/Desktop/DurationSample/DurationSample/ViewController.swift:13:34 (closure) 2.6ms /Users/username/Desktop/DurationSample/DurationSample/ViewController.swift:13:14 @objc get {} 0.1ms /Users/username/Desktop/DurationSample/DurationSample/ViewController.swift:13:14 @objc set {} 0.1ms /Users/username/Desktop/DurationSample/DurationSample/ViewController.swift:5:19 @objc override func viewDidLoad() 0.1ms /Users/username/Desktop/DurationSample/DurationSample/ViewController.swift:9:19 @objc override func didReceiveMemoryWarning() 3.8ms /Users/username/Desktop/DurationSample/DurationSample/ViewController.swift:18:10 @objc func createArray() 8.3ms /Users/username/Desktop/DurationSample/DurationSample/ViewController.swift:23:10 @objc func createDictionary() 0.0ms /Users/username/Desktop/DurationSample/DurationSample/ViewController.swift:3:7 @objc deinit 0.2ms /Users/username/Desktop/DurationSample/DurationSample/ViewController.swift:3:40 @objc @objc override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) 0.2ms /Users/username/Desktop/DurationSample/DurationSample/ViewController.swift:3:40 @objc @objc required override init?(coder aDecoder: NSCoder)
dòng 13 lazy var strings đã chỉ còn 1.3ms và Method createArray cũng chỉ còn 3.8ms cho thời gian build (hehe).
Với cách làm như trên, chúng ta có thể tính toán được thời gian build cho tổng thể project, cho từng file và chi tiết nhất là cho từng hàm. Để từ những con số thống kê đó chúng ta có thể phán đoán được các vấn đề, nguyên nhân và chỉnh sửa chúng. Hi vọng bài viết giúp ích được cho các bạn phần nào trong quá trình phát triển phần mềm với Swift (lay2)
Nguồn: Qiita