原文地址: http://nszzy.me/2016/03/20/reduce-xcode-build-times/
平常在調試工程的時候, 特別是大工程, 浪費在編譯上的時間加起來也是個不小的數目. 我戲成它為帶薪編譯. 帶薪編譯一來呢浪費公司資源, 二來使得開發效率大大降低. 所以提高Xcode的編譯速度還是非常有必要的. 關于通過更改一些Xcode的配置來提升編譯速度這篇文章已經列舉除了幾個不錯的方法, 這里就不再多說.
這篇文章主要講的是從硬件方面來提升Xcode的編譯速度. 因為對比了現在日常使用的Mac mini和MacBook Pro, 在CPU和內存基本沒有差別的情況下, 相比MacBook Pro的SSD, Mac mini的機械硬盤的表現實在是慘不忍睹. 這也是拖慢了編譯速度的主要元兇. 所以, 去換一個SSD吧.(Excuse me?)
本文所講的方法理論上編譯速度是可以超過SSD的. 在說具體方法之前, 先來了解一下拖慢編譯速度的元兇Derived Data:
Derived Data
Derived Data是Xcode自動生成的一些派生數據的文件夾. 里面包含有一些索引文件、Log、編譯時產生的文件. 編譯時候產生的文件包括:
- 第三方庫的
.a
文件 - 應用程序
.app
文件 - 保存函數地址映射信息的中轉文件
.dSYM
文件
所以, 寫這些數據的時候, 寫得越快, 編譯的時間也就能越少. 如何讓數據寫入得更快呢? 可以把Derived Data的路徑換到內存中. 換句話說, 將Derived Data的讀寫從硬盤移動到內存中.
在內存中創建虛擬磁盤
What? 內存當硬盤用? 是的你沒聽錯, 其實OS X系統是允許在內存中創建一個可以高速存取的虛擬磁盤的. 通過以下兩種方法可以實現在內存中創建虛擬磁盤:
1. iRamDisk
在AppStore上找到了這么一個神器, 叫iRamDisk, 14.99刀. 使用它可以非常簡單地創建一個Xcode的DerivedData的虛擬磁盤, 如下. 都是圖形化界面, 很好操作, 就不多贅述了.
這里分享一個破解版(提取碼
9u38
)僅供學習交流使用, 建議購買正版支持開發者.
2. 命令行創建
① 創建RAM disk并分配空間
size的計算公式 size = 需要分配的空間(M) * 1024 * 1024 / 512
. 例如下面分配的空間為2GB: 2048 * 1024 * 1024 / 512 = 4194304
.
$ hdid -nomount ram://4194304
執行完這個命令之后, 終端會輸出/dev/diskN
, N
是一個數字, 記下它, 后面兩步有用.
② 在RAM disk上創建HFS
給虛擬磁盤創建名字, 如下為DerivedData
, 并將rdiskN
的N
改為第一步中的N
的數字. (注意: rdiskN
不要錯寫成diskN
)
$ newfs_hfs -v DerivedData /dev/rdiskN
③ 把虛擬磁盤安裝到Xcode的DerivedData目錄下
如下命令, 同樣把diskN
中的N
替換成第一步中N
的數字. (注意: 此時是diskN
)
$ diskutil mount -mountPoint ~/Library/Developer/Xcode/DerivedData /dev/diskN
這樣就大功告成了! 不出意外就可以在桌面(或者Finder)上看到DerivedData
這個盤. 如果不要虛擬磁盤了, 可以在Finder中推出這個磁盤, 或者執行以下命令卸載這個磁盤:
$ diskutil umount /dev/diskN
總結
1. 優點:
- 編譯速度加快.
- 創建虛擬磁盤后, 并不是直接占用掉所有分配的空間, 而是根據虛擬磁盤中的文件總大小來逐漸占用內存.
2. 缺點:
- 每次關閉系統之后, 虛擬磁盤將會被卸載, 下次開機后需要重新創建虛擬磁盤. 同時因為Derived Data已經被刪除.
- 內存有限, 不宜創建太大的虛擬磁盤, 需要在系統性能和需要的虛擬磁盤空間中找一個平衡點.
3. 可能遇到的坑
- 如果創建的虛擬磁盤已滿, 會導致編譯的失敗. 此時清除掉Derived Data后重新編譯, 就算有足夠的空間也還是有可能會導致編譯失敗. 重啟Xcode可以解決此問題.