優化應用的啟動時間(實踐篇)

上一篇筆記記錄了 session 的理論部分,這里接著記錄實踐部分。

重述

簡要地捋一下應用啟動的過程:首先是 dyld 解析得到所需的共享庫,然后將庫映射到應用的地址空間里面,通過 rebasing 和 binding 修正函數和數據指針的地址,接著注冊 ObjC 的類、調用所有的 initializers,最后才是調用 main() 函數。

測量

應用的啟動的方式有兩種——冷啟動和熱啟動:前者是啟動應用時沒有任何數據被內核緩存,比如說重啟設備后再打開應用就是冷啟動;后者在啟動時已經有數據被緩存,盡管你能退出這個應用,但是內核還是不一定會清除掉緩存。

要想測量調用 main() 函數之前的所耗費的時間,用我先前寫的 TICK TOCK 這兩個宏是不可能的。但是在 Xcode 中,可以添加一個環境變量 DYLD_PRINT_STATISTICS

DYLD_PRINT_STATISTICS.png

那么在啟動的時候就能看動態庫加載、rebase/binding 等等各部分的時間(Xcode 8,iOS 10 環境下):

pre_main_comsuming_hot.png
pre_main_comsuming_cold.png

提升

Dylib Loading

  • 因為系統中的 dylibs 的數據都是經過 pre-calculate 的,在加載的時候會特別的快(不太清楚這一點,找不到相關資料)。而使用內嵌到 App Bundle 的 dylib 的開銷很高,而且 App Store 似乎不允許這么做;
  • 合并一些動態庫以減少數量,異或考慮使用 .a 靜態庫。而實際中前者幾乎是不可行的,合并一些靜態庫還是可以的;
  • 使用 dlopen() 加載 dylib,不過這也只是把一些工作延后而已,而且還可能會有其他的問題。

Rebas/Binding

  • 減少 __DATA segment 中的數據指針,類似下面這種:
data_pointer.png
  • 減少 ObjC 的元數據(class, categories, selector);
  • 減少 C++ 虛函數;
  • Swift 的結構體使用更少需要被修正的指針數據,所以盡量使用 Swift;(現在還不是很了解 Swift ??)。

ObjC Setup

  • 啟動時 Objc runtime 要注冊 class 和 cacategory,開發的時候注意下別弄冗余的類就行了;
  • 接下來更新 Non-fragile ivars 的偏移量,響應地就減少一點實例變量;
  • 關于 Selector Uniquing, [objc explain]: Selector uniquing in the dyld shared cache 里面有說到這是 Objective-C 啟動開銷比較大的一塊,方法少一點就快一點。
  • 感覺對于 ObjC Setup 的這一塊沒多少可優化的。

Initializers

Initializers 分為顯式的和隱式的,這些都會在啟動的時候被調用。我覺得這一塊才是實際開發中值得注意的一部分:
對于顯式的 initializers:

  • 使用 +initialize 而不是 +load。前者在類接收到第一個發送給它的消息之前,后者這是在類被注冊的時候。
  • 減少使用 __attribute__((constructor)) 修飾的函數,這些函數會在 ObjC Setup 階段完之后調用。如果只是想執行一次這個函數,用 dispatch_once(), pthread_once(), std::once() 這些 site initializers 代替它會比較好,一是將工作放到了啟動之后,二是系統對 dispatch_once() 有優化。另外要寫 C++ 跨平臺的代碼就用 std::once() 吧。

對于隱式的 initializers:

  • C++ 中那些 static non-trivial constructors 可以用上面說的 site initializers 代替,或者用 Swift 重寫;
  • 不要在 initializers 中調用 dlopen(),也不要創建線程;

總結

在調用 main() 函數之前,我覺得能做的、對性能提升比較大的是在 initializers 這一塊。類、實例變量等等的數目對啟動的影響不大。而在進入 -application:didFinishLaunchingWithOptions: 之后,將一些不是必須在主線程進行的 IO 或計算任務放到低優先級的子線程中執行比較好,這樣可以盡快的返回。

話說,site initializers 是什么意思啊,Google 了半天沒找著……??

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,882評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,208評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,746評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,666評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,477評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,960評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,047評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,200評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,726評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,617評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,807評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,327評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,049評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,425評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,674評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,432評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,769評論 2 372

推薦閱讀更多精彩內容

  • 這是一篇 WWDC 2016 Session 406 的學習筆記,從原理到實踐講述了如何優化 App 的啟動時間。...
    茗涙閱讀 1,874評論 0 3
  • 這是一篇 WWDC 2016 Session 406 的學習筆記,從原理到實踐講述了如何優化 App 的啟動時間。...
    請叫我周小帥閱讀 524評論 0 2
  • 這是一篇 WWDC 2016 Session 406 的學習筆記,從原理到實踐講述了如何優化 App 的啟動時間。...
    MTDeveloper閱讀 751評論 0 1
  • 應用啟動時間,直接影響用戶對一款應用的判斷和使用體驗。頭條主app本身就包含非常多并且復雜度高的業務模塊(如新聞、...
    hgl閱讀 442評論 0 0
  • App 運行理論 理論速成Mach-O 術語Mach-O 是針對不同運行時可執行文件的文件類型。文件類型:Exec...
    未明一二閱讀 555評論 1 3