Vì chờ đợi Xcode build tiêu tốn nhiều tời gian → đã sửa để giảm trên 50% thời gian build
Bài đăng này đã không được cập nhật trong 7 năm
Mở đầu
Chờ build lâu quá, nhiều khi đầu phát ngáo ^^. Không biết các bạn có bị tiêu tốn thời gian giống mình không nhỉ? (khoc) Nhưng ở trên mạng hiện đang share rất nhiều cách để giảm thời gian build trên Xcode Do đó trong bài viết này mình xin giới thiệu đến các bạn phương pháp mà mình đang thấy nó thích hợp nhất với các Project mà mình đang phát triển, và thống kê đo lường mức độ hiệu quả của phương pháp bằng các con số rõ ràng
Môi trường kiểm chứng
Trước khi tính toán thời gian build giảm như thế nào, mình liệt kê trạng thái project và môi trường thực hiện.
Swift3.1
và một phầnObjective-C
được dùng trong một project lớn (quy mô hàng trăm - hàng nghìn file)- không sử dụng tính toán union
nil
,lazy var
về cơ bản cũng không dùng - Có setting hạn chế, phân chia truy cập file (final hay private...)
- Sử dụng
Cocoapods
vàCarthage
- Do team dev phát triển dự án khá đông người nên dù chỉ chậm 1 giây thôi cũng tích luỹ và thay đổi rất nhiều trong việc build.
- không sử dụng tính toán union
- Việc Build: Sử dụng
Xcode 8.3.3/iOS10.3.1 Simulator
- Nếu Build chỉ trên Device thì so sánh với Simulatior sẽ hơi mất thời gian hơn
- PC: Sử dụng
Macbook Pro 15inch (2013)
- Để kiểm chứng chính xác thì trước tiên ta reset
Xcode
đã : restartXcode
, xoá fileDrived Data
, Clean (Cmd + Shift + Opt + K) - Vì tính toán thời gian Build thuần khiến (Pure Build) nên về cơ bản thì chúng ta Close hết các App ko liên quan khác đi
Before & After
Trước tiên là kết quả ngắn gọn của lần tính này (kết quả chi tiết sẽ có ở phần cuối) Các bạn có thể nhìn thấy Build Debug tiết kiệm được hơn một nửa thời gian, nhưng Build Release thì gần như chúng ta không thấy được hiệu quả là bao :v
Build Debug | Build Release | |
---|---|---|
Before | 266s | 384s |
After | 110s( 58.6%↓) | 373s(1.8%↓) |
Hiển thị thời gian build
Chúng ta kiểm tra xem hiện tại Xcode của chúng ta có hiển thị thời gian build không? Nếu chưa hiển thị các bạn hãy thực hiện lệnh sau trên Terminal
defaults write com.apple.dt.Xcode ShowBuildOperationDuration YES
Khi đó, nếu build thành công, thời gian sẽ hiện ra ở phía bên phải như hình
1. Edit Optimization Level
Build Settings > Swift Compiler > Optimization Level
Build Debug
là quá trình build diễn ra thường xuyên nên việc set Optimization sẽ làm cho thời gian build bị tăng lên. Vì vậy ta hãy set là None thôi:
Bật cờ SWIFT_WHOLE_MODUE_OPTIMIZATION
Ở phần setting, ta mở Build Settings
, chọn nút + và tap vào User-Defined Setting
như bên dưới
Sau đó ta setting Yes với Key/Value này
Như ở trên Build Debug
mặc dù ta đã để cờ Optimization Level thành NONE, nhưng ở đây Optimization ta setting thành YES thì nó lại giúp giảm thời gian build đi =)) (tại sao lại như thế thì mình cũng chưa có câu trả lời chính xác)
Còn ở Build Release
thì set hai cái cờ này mình đã kiểm chứng là không đêm lại chút hiệu quả nào cả
2. Edit Build Options > Debug Information Format
Cái này cũng giống Optimization Level
Những Project Xcode gần đây đều được setting default hết rồi, nên tôi nghĩ là ko hiệu quả mấy, tuy nhiên những project cũ mà ta cần edit thì hãy xem phần này và sửa có lẽ là sẽ hiệu quả đấy ^^ .
Build Settings > Build Options > Debug Information Format
Ở đây ta setting là DWARF with dSYM File
hoặc DWARF
Nếu ta ko cần file dSYM
thì setting là DWARF
dSYM
cần dùng trong việc phân tích file crash, vì vậy khi nó đang được sử dụng để detecting crash thì sẽ ko thể thay đổi settings được. Hãy chú ý điều này. Ở trường hợp của tôi thì khi Build Debug
không cần dSYM
nên tôi chọn setting là DWARF
.
3. Tìm các method mà tốn thời gian compile và refactoring chúng
Build Time analyzer for Xcode
Đây là một tool để tính toán thời gian build của các file rất tiện lợi, các bạn rất nên sử dụng ^^. Tuy nhiên lần nào debug cũng sử dụng sẽ khá là nặng nhọc, vì vậy để việc sử dụng đỡ mất tay hơn ta hãy setting theo phương pháp sau:
Build Setting > Other Swift Flags
ở đây ta sẽ định nghĩa :
-Xfrontend -warn-long-function-bodies=100
Method nào mà thời gian build dài sẽ đượng hiển thị cảnh báo ở đây
/Users/ruwatana/Hoge/ViewController.swift:100:10: Instance method 'hoge()' took 1000ms to type-check (limit: 100ms)
Tạm thời ta để mức cảnh báo hiển thị là từ 100ms trở lên. Sau đó chúng thay hãy refactoring các method để cảnh báo không còn hiển thị bằng việc tham khảo hướng dẫn theo link dưới đây nhé. Chủ yếu những cái mất thời gian là những kiểu giá trị CGFloat. Regarding Swift build time optimizations
4. tăng số lượng task compile đồng thời -> Multitask
Tuy nhiên xin được viết kết luận luôn là cái này không hiệu quả =)) Cách này được viết ở một số bài khác mà mình tham khảo. Đó là Xcode mặc định chỉ sử dụng một task (process) để thực hiện việc build project nên nếu tăng số lượng task thực hiện lên khả năng thời gian build sẽ giảm đi. Tuy nhiên mình đã thử trên con Macbook Pro 15inch settings khoảng từ 4 đến 8 task để thực hiện build nhưng không thấy hiệu quả. Tóm lại, để nguyên gốc vẫn là tối ưu nhất.
Cách làm các bạn có thể thử trên máy của mình như sau:
Ở terminal
các bạn thực hiện lệnh sau (4 task) :
defaults write com.apple.dt.Xcode IDEBuildOperationMaxNumberOfConcurrentCompileTasks 4
Ở máy của mình dùng setting này thì lúc nhanh hơn chút lúc chậm hơn chút ^^ Nếu setting bị sai thì ta có thể xoá setting đó đi bằng câu lệnh sau :
defaults delete com.apple.dt.Xcode IDEBuildOperationMaxNumberOfConcurrentCompileTasks
Kết quả
Cảm ơn các bạn đã giành thời gian đọc đến cuối bài
Thực tế của lần cải thiện này ở môi trường Debug
đã giảm được hơn một nửa thời gian
Tuy nhiên ở môi trường Release
thì hầu như không có thay đổi kết quả lớn nào.
Nếu các bạn có biết cách cải thiện thời gian build nào khác xin hãy giới thiệu để mình và cộng đồng được biết nhé (bow)
Dưới đây là tổng hợp kết quả :
Chức năng | Debug | Release |
---|---|---|
Before | 266s | 384s |
1. Edit Optimization Setting | 122s (54%↓) | - |
2. Change Debug Information Format to DWARF | 247s(7.1%↓) | - |
3. Code Refactor | 264s (0.7%↓) | 373s(1.8%↓) |
4. MultiTask | Chậm hơn | Chậm hơn |
Kết hợp tất cả (After) | 110s(58.6%↓) | 373s(1.8%↓) |
Tham khảo Qiita
All rights reserved