iOS App啓動優化(二):物理內存和虛擬內存markdown
iOS App啓動優化(四):編譯期插樁 && 獲取方法符號ide
iOS App啓動優化(五):收集符號 && 生成 Order File函數
APP
被後臺kill
後從新啓動APP
,這種啓動方式叫作冷啓動。APP
的狀態由running
切換爲suspend
,APP
沒有被kill
仍然在後臺運行。再次把APP
切換到前臺,這種啓動方式叫熱啓動。main()
函數做爲關鍵點分割成兩塊t1
階段,main()
以前的處理所需時間,稱爲pre-main
t2
階段,main()
及main()
以後處理所需時間pre-main
t2
階段耗時的主要是業務代碼oop
推薦 BLStopwatch,這個工具能夠打點統計業務耗時post
本部分優化根據各自業務需求自行處理性能
pre-main
時間經過添加環境變量能夠獲取到pre-main
階段的時間 測試
DYLD_PRINT_STATISTICS
Xcode
中提供了測量 pre-main
的時間 Edit scheme -> Run -> Auguments
添加環境變量 DYLD_PRINT_STATISTICS
,value
設爲YES
。
啓動之後能夠看到啓動時長
dylib
分析每一個dylib
(大部分是系統的),找到其Mach-O
文件,打開並讀取驗證有效性;找到代碼簽名註冊到內核,最後對dylib
的每一個segment
調用mmap()
。
在dylib
的加載過程當中系統爲了安全考慮引入了ASLR
(Address Space Layout Randomization
)技術和代碼簽名。
ASLR
技術:鏡像Image
、可執行文件、dylib
、bundle
在加載的時候會在其指向的地址(preferred_address
)前面添加一個隨機數誤差(slide
),防止應用內部地址被定位。
dylib
加載完成以後,它們處於相互獨立的狀態,須要綁定起來。
Rebase
將鏡像讀入內存,修正鏡像內部的指針,性能消耗主要在IO
。
Bind
是查詢符號表,設置指向鏡像外部的指針,性能消耗主要在CPU
計算。
runtime
會維護一張類名與類的方法列表的全局表。
class registration
)category registration
)selector
的惟一性(selector uniquing
)這部分其實就是load
方法的耗時
DYLD_PRINT_STATISTICS_DETAILS
還能夠獲取更詳細的時間,添加環境變量DYLD_PRINT_STATISTICS_DETAILS
,value
設爲YES
。
load()
方法裏執行操做,把操做推遲到initialize()
方法繼續瞭解優化請移步 iOS App啓動優化(二):物理內存和虛擬內存