如何讓 Xcode 在讀寫上提速100倍?

故胤道長發表於2017-04-27
111721232-e5dcce65c3e2c402

上個月參加了一場西雅圖當地的線下 iOS 開發者聚會。Jeff Szuhay 作為一個有20+年開發經驗的資深程式設計師,跟我講了一套提高 iOS 開發效率的方法。相比於其他程式設計師在 App 啟動時間、架構優化方面的經驗,老爺子 Jeff 的優化基於硬體層面,匠心獨運,極客風十足。以下是他的經驗分享和我個人的實測。

問題來源

我們都知道 Xcode 在執行或編譯時,會有大量的讀寫操作。例如從硬碟中呼叫圖片,我們會這麼操作:

這時候 Xcode 就會去電腦的硬碟中去找到圖片,完成讀寫操作。類似的操作還有存取檔案等等。如果這類讀取數量比較少,那麼無傷大雅,但是一旦多起來,尤其是大專案在後期產生了大量的 DerivedData 存在硬碟上,Xcode 在編譯時就會花大量時間去硬碟(Disk)上完成讀寫這些資料的操作。更不幸的是有時候還會遇到硬碟故障等問題。

解決思路

正所謂“哪裡需要優化,哪裡就需要程式設計師”,Jeff 在這個時候作為一名白衣騎士登場了。多年的計算機研究讓他對整個計算機架構非常熟悉。下圖是他展示的計算機結構簡圖。

121721232-adf5f8a841eb5116
計算機結構簡圖

此圖簡潔明瞭得說明了計算機的基本架構。左上角是計算機的大腦,CPU,負責核心計算和處理工作;右上角是記憶體(RAM),用來執行程式並與 CPU 進行資料交流;中間的線是匯流排,負責各個模組之間傳遞資訊和訊號;圖下側是基本的 System IO。

再回來看我們的問題:Xcode 現在是在 RAM 中執行,然後到 Storage 中讀寫資料,資料接著再傳回 RAM。這種方式有兩個瓶頸:

  • Storage 速度很慢。即使是最先進的 SSD,其速度也比 RAM 慢了400倍。也就是無論你怎麼在軟體層優化,其速度也無法突破 SSD 的瓶頸;
  • 資料要不停的在各個模組之間傳遞。傳遞過程中亦有延時和無謂的時間消耗。

針對以上兩個瓶頸,Jeff 認為,如果我們可以讓所有的讀寫操作都在記憶體(RAM)中完成,那麼必然能大幅提高 Xcode 的工作效率。問題是,怎麼實現?

實現方法

方法的思路很簡單,大概可以分兩步:

  1. 配置 RAM。在記憶體中專門開出一塊讓 Xcode 使用。
  2. 連線 Xcode。讓 Xcode 連線到我們開闢出來的專屬記憶體空間。

下面就是見證奇蹟的時刻。

第一步, 建立 .sh 檔案。程式碼如下。

第二步, 執行 .sh 檔案。在命令列中敲下。

131721232-bb3796ea2f216f41

之後你會發現你會多出一個叫 ramdisk 的記憶體空間,有大概 1 GB 大小。

141721232-14e9522d7e98fd63

第三步,連線 Xcode。Xcode -> Preferences -> Locations -> Locations Tab,配置 DerivedData。

151721232-ba3d35d2401dfc28

Advanced… 也要配置成下圖所示

161721232-14fc390ed45351fb

以上就是全部步驟。這時候你就可以享受飛一般的開發了。現在 Project 中所有檔案都在記憶體中,相比於 SSD,理論上是要快上一個數量級。

注意事項

  • 合理分配記憶體空間。我這裡分配了 1GB 的記憶體當硬碟使,是因為我電腦本身有 16GB 記憶體空間。假如你電腦記憶體只有 4GB,我不建議你使用這個方法,或者建議只分配 256M 空間給 Xcode。總之,注意記憶體不足或溢位的情況。
  • 只把 DerivedData 放在 Ram Disk 中。為了極限速度,你當然可以把 App 相關所有的檔案都放在記憶體空間中。但是要知道,我們創造的 Ram Disk 本質是記憶體,當關機或重啟的時候,在 Ram Disk 中的資料是會丟失的。而 DerivedData 是可以重新生成的,所以放在 Ram Disk 中可以最大限度的提高 Xcode 開發中的讀取速度,且十分安全。

參考

打賞支援我寫出更多好文章,謝謝!

打賞作者

打賞支援我寫出更多好文章,謝謝!

任選一種支付方式

如何讓 Xcode 在讀寫上提速100倍? 如何讓 Xcode 在讀寫上提速100倍?

相關文章