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

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ần Objective-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 CocoapodsCarthage
    • 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.
  • 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 đã : restart Xcode, xoá file Drived 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 Debuglà 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