![111721232-e5dcce65c3e2c402](https://i.iter01.com/images/dcbb5454330ab2b0d0864d541af9fb362fd11ad8a9b0efd1cc4027587217d61e.png)
上個月參加了一場西雅圖當地的線下 iOS 開發者聚會。Jeff Szuhay 作為一個有20+年開發經驗的資深程式設計師,跟我講了一套提高 iOS 開發效率的方法。相比於其他程式設計師在 App 啟動時間、架構優化方面的經驗,老爺子 Jeff 的優化基於硬體層面,匠心獨運,極客風十足。以下是他的經驗分享和我個人的實測。
問題來源
我們都知道 Xcode 在執行或編譯時,會有大量的讀寫操作。例如從硬碟中呼叫圖片,我們會這麼操作:
1 |
let image = UIImage(named: "imageName") |
這時候 Xcode 就會去電腦的硬碟中去找到圖片,完成讀寫操作。類似的操作還有存取檔案等等。如果這類讀取數量比較少,那麼無傷大雅,但是一旦多起來,尤其是大專案在後期產生了大量的 DerivedData 存在硬碟上,Xcode 在編譯時就會花大量時間去硬碟(Disk)上完成讀寫這些資料的操作。更不幸的是有時候還會遇到硬碟故障等問題。
解決思路
正所謂“哪裡需要優化,哪裡就需要程式設計師”,Jeff 在這個時候作為一名白衣騎士登場了。多年的計算機研究讓他對整個計算機架構非常熟悉。下圖是他展示的計算機結構簡圖。
![121721232-adf5f8a841eb5116](https://i.iter01.com/images/463b2983c2d7638c70a1f64e356a56e4aa0c2efef1559c438e71d6c60fc66e03.png)
此圖簡潔明瞭得說明了計算機的基本架構。左上角是計算機的大腦,CPU,負責核心計算和處理工作;右上角是記憶體(RAM),用來執行程式並與 CPU 進行資料交流;中間的線是匯流排,負責各個模組之間傳遞資訊和訊號;圖下側是基本的 System IO。
再回來看我們的問題:Xcode 現在是在 RAM 中執行,然後到 Storage 中讀寫資料,資料接著再傳回 RAM。這種方式有兩個瓶頸:
- Storage 速度很慢。即使是最先進的 SSD,其速度也比 RAM 慢了400倍。也就是無論你怎麼在軟體層優化,其速度也無法突破 SSD 的瓶頸;
- 資料要不停的在各個模組之間傳遞。傳遞過程中亦有延時和無謂的時間消耗。
針對以上兩個瓶頸,Jeff 認為,如果我們可以讓所有的讀寫操作都在記憶體(RAM)中完成,那麼必然能大幅提高 Xcode 的工作效率。問題是,怎麼實現?
實現方法
方法的思路很簡單,大概可以分兩步:
- 配置 RAM。在記憶體中專門開出一塊讓 Xcode 使用。
- 連線 Xcode。讓 Xcode 連線到我們開闢出來的專屬記憶體空間。
下面就是見證奇蹟的時刻。
第一步, 建立 .sh 檔案。程式碼如下。
1 2 3 4 5 |
#!/bin/bash RAMDISK=”ramdisk” SIZE=1024 #size in MB for ramdisk. diskutil erasevolume HFS+ $RAMDISK \ `hdiutil attach -nomount ram://$[SIZE*2048]` |
第二步, 執行 .sh 檔案。在命令列中敲下。
![131721232-bb3796ea2f216f41](https://i.iter01.com/images/d5fc422d1099922da6bdb1a50347f6b2704f1c04dec787d1ca19b9654d727e18.png)
之後你會發現你會多出一個叫 ramdisk 的記憶體空間,有大概 1 GB 大小。
![141721232-14e9522d7e98fd63](https://i.iter01.com/images/095e82608d1a14db6fb67ce1008c5555e97f362bd86c06192771b6e14d324679.png)
第三步,連線 Xcode。Xcode -> Preferences -> Locations -> Locations Tab,配置 DerivedData。
![151721232-ba3d35d2401dfc28](https://i.iter01.com/images/3ed7c445e3ed407dccd6c7cc6d578f89a497f51e7783db90fb98a988f721c824.png)
Advanced… 也要配置成下圖所示
![161721232-14fc390ed45351fb](https://i.iter01.com/images/bd0b67c78091186498e683ddc582bf826913122492b8c1ab309bb4d3bb57dd63.png)
以上就是全部步驟。這時候你就可以享受飛一般的開發了。現在 Project 中所有檔案都在記憶體中,相比於 SSD,理論上是要快上一個數量級。
注意事項
- 合理分配記憶體空間。我這裡分配了 1GB 的記憶體當硬碟使,是因為我電腦本身有 16GB 記憶體空間。假如你電腦記憶體只有 4GB,我不建議你使用這個方法,或者建議只分配 256M 空間給 Xcode。總之,注意記憶體不足或溢位的情況。
- 只把 DerivedData 放在 Ram Disk 中。為了極限速度,你當然可以把 App 相關所有的檔案都放在記憶體空間中。但是要知道,我們創造的 Ram Disk 本質是記憶體,當關機或重啟的時候,在 Ram Disk 中的資料是會丟失的。而 DerivedData 是可以重新生成的,所以放在 Ram Disk 中可以最大限度的提高 Xcode 開發中的讀取速度,且十分安全。
參考
- Performance Considerations for macOS/iOS Development in the “New Frontier”
- Cache In Your Pocket: Use a RAM disk for Xcode
打賞支援我寫出更多好文章,謝謝!
打賞作者
打賞支援我寫出更多好文章,謝謝!
任選一種支付方式