掃一掃關注公衆號,得到更多iOS相關內容bash
這篇文章會給你們介紹一下關於啓動優化,咱們能夠從哪些方面入手,而不會講具體的實現,具體的實現會在後面其它專題的文章中陸續給你們引出來。app
這篇文章所提的啓動都是冷啓動。函數
在進行啓動優化以前,咱們首先要知道爲何要進行啓動優化,相信看了下面這組數據,你就會意識到啓動優化的重要性:性能
iOS冷啓動過程爲:從用戶點擊App圖標開始到appDelegate didFinishLaunching方法執行完成爲止。這個過程主要分爲兩個階段:測試
啓動時間(T)= main()函數執行以前的時間(T1)+ main()函數執行以後的時間(T2).
複製代碼
dyld裏有內置的測量系統,能夠經過設置環境變量訪問:優化
這段時間咱們能夠經過插入代碼來測量。網站
CFAbsoluteTime StartTime;
int main(int argc, char * argv[]) {
StartTime = CFAbsoluteTimeGetCurrent();
...
}
複製代碼
extern CFAbsoluteTime StartTime;
複製代碼
double launchTime = (CFAbsoluteTimeGetCurrent() - StartTime);
複製代碼
蘋果的經驗法則告訴咱們:400ms是一個不錯的啓動時間。 **注意:**在測量啓動時間時,須要在最慢的支持設備上進行測試。spa
先回顧下Dyld的加載步驟: 操作系統
接下來咱們從這幾個步驟來分析下有哪些能夠進行啓動優化的點平均每一個應用會包含100到400個dylib,可是系統的dylibs很是快。 加載內嵌的dylib很是昂貴。線程
優化方案:依賴的dylib越少越好。
Rebase因爲有許多I/O操做,會慢一些,而Bind在計算上會昂貴一些。其時間都消耗在修復__DATA段裏的指針上。
優化方案:減小修復指針的數量
大部分ObjC初始化工做已經在Rebase & Bind階段完成了,這一步dyld會註冊全部聲明過的ObjC類,將分類插入到類的方法列表中,再檢查每一個selector的惟一性。
優化方案:同Rebase & Bind
這個階段,dyld開始運行程序的初始化函數,調用每一個Objc類和分類的+load方法,調用C/C++ 中的構造器函數(用attribute((constructor))修飾的函數),和建立非基本類型的C++靜態全局變量。
優化方案:
這一階段要根據具體的業務進行優化,這裏不作過多闡述,後面的文章中也會有相關內容,記住指導原則:在知足業務須要的前提下,didFinishLaunchingWithOptions在主線程裏作的事情越少越好。