iOS啟動(dòng)優(yōu)化

想做app啟動(dòng)優(yōu)化侠鳄,當(dāng)然是先了解app啟動(dòng)听诸,什么時(shí)候開始桅狠?什么時(shí)候結(jié)束?哪里是我們可以去優(yōu)化的地方趴荸?

app啟動(dòng)開始:加載應(yīng)用的可執(zhí)行文件Mach-O

app啟動(dòng)結(jié)束:調(diào)用didFinishLaunchingWithOptions

Mach-O 可執(zhí)行文件

  • app啟動(dòng)這里我分成兩個(gè)階段:pre-main階段和main()階段
pre-main階段

1.加載應(yīng)用的可執(zhí)行文件Mach-O

2.加載動(dòng)態(tài)鏈接庫加載器dyld(dynamic loader)

3.dyld遞歸加載應(yīng)用所有依賴的dylib (dynamic library動(dòng)態(tài)鏈接庫)

main()階段

1.dyld調(diào)用main()

2.調(diào)用UIApplicationMain()

3.調(diào)用applicationWillFinishLaunching

4.調(diào)用didFinishLaunchingWithOptions

好了儒溉,任務(wù)分好了,開始干活7⒍邸6倩痢!

注:優(yōu)化時(shí)間=優(yōu)化前時(shí)間-優(yōu)化后時(shí)間

//下面使用模擬器酝豪,建議使用真機(jī)+release+冷啟動(dòng)涛碑,得到數(shù)據(jù)才最真實(shí)

一.pre-main階段

屏幕快照 2019-01-16 下午1.59.12.png

在 Xcode 中 Edit scheme -> Run -> Arguments 將環(huán)境變量DYLD_PRINT_STATISTICS 設(shè)為1 ,打鉤

屏幕快照 2019-01-16 下午2.05.25.png

根據(jù)官方給的四個(gè)time,我們可以分為四個(gè)步驟

  • 1.load dylibs

這一階段dyld會(huì)分析應(yīng)用依賴的dylib孵淘,找到其mach-o文件蒲障,打開和讀取這些文件并驗(yàn)證其有效性瑞眼,遞歸加載所有依賴庫单山。

一般情況下栅螟,iOS應(yīng)用會(huì)加載幾百個(gè)dylibs蚂维,其中大部分是系統(tǒng)庫,這部分對(duì)dylib的加載做了緩存操作毙籽。

所以洞斯,依賴的dylib越少越好,我們可以優(yōu)化的地方:

1.盡可能減少依賴的dylib的數(shù)量
2.使用開銷較小的dylib

  • 2.rebase/bind

在dylib的加載過程中坑赡,系統(tǒng)為了安全考慮烙如,引入了ASLR(Address Space Layout Randomization)技術(shù)和代碼簽名。由于ASLR的存在垮衷,鏡像(Image厅翔,包括可執(zhí)行文件乖坠、dylib和bundle)會(huì)在隨機(jī)的地址上加載搀突,和之前指針指向的地址(preferred_address)會(huì)有一個(gè)偏差(slide),dyld需要修正這個(gè)偏差熊泵,來指向正確的地址仰迁。

Rebase在前,Bind在后顽分,Rebase做的是將鏡像讀入內(nèi)存徐许,修正鏡像內(nèi)部的指針,性能消耗主要在IO卒蘸。Bind做的是查詢符號(hào)表雌隅,設(shè)置指向鏡像外部的指針,性能消耗主要在CPU計(jì)算缸沃。

所以恰起,指針數(shù)量越少越好,我們可以做的優(yōu)化有:

1.減少類Class趾牧、方法selector检盼、分類category的數(shù)量
2.減少C++虛函數(shù)的的數(shù)量(創(chuàng)建虛函數(shù)表有開銷)
3.使用Swift structs(內(nèi)部做了優(yōu)化,符號(hào)數(shù)量更少)

  • 3.Objc setup

大部分ObjC初始化工作已經(jīng)在Rebase/Bind階段做完了翘单,這一步dyld會(huì)注冊(cè)所有聲明過的ObjC類吨枉,將分類插入到類的方法列表里,再檢查每個(gè)selector的唯一性哄芜。

在這一步倒沒什么優(yōu)化可做的貌亭,Rebase/Bind階段優(yōu)化好了,這一步的耗時(shí)也會(huì)減少认臊。

  • 4.Initializers

到了這一階段属提,dyld開始運(yùn)行程序的初始化函數(shù),調(diào)用每個(gè)Objc類和分類的+load方法,調(diào)用C/C++ 中的構(gòu)造器函數(shù)(用attribute((constructor))修飾的函數(shù))冤议,和創(chuàng)建非基本類型的C++靜態(tài)全局變量斟薇。Initializers階段執(zhí)行完后,dyld開始調(diào)用main()函數(shù)恕酸。

在這一步堪滨,我們可以做的優(yōu)化有:

1.少在類的+load方法里做事情,盡量把這些事情推遲到+initiailize

2.減少構(gòu)造器函數(shù)個(gè)數(shù)蕊温,在構(gòu)造器函數(shù)里少做些事情

3.減少C++靜態(tài)全局變量的個(gè)數(shù)

二.main()階段

屏幕快照 2019-01-16 下午3.24.51.png
屏幕快照 2019-01-16 下午3.29.58.png

在mian.m和AppDelegate.m中加上以上代碼袱箱,可以獲得main()之后啟動(dòng)時(shí)間

這個(gè)階段牽扯到我們的業(yè)務(wù),功能的實(shí)現(xiàn)

  • 參考個(gè)人項(xiàng)目:在didFinishLaunchingWithOptions方法中
    是否顯示引導(dǎo)頁义矛、是否需要登錄发笔、新版本的檢測(cè)、注冊(cè)推送凉翻、網(wǎng)絡(luò)狀態(tài)的檢測(cè)了讨、三方庫的配置和初始化等
    首頁控制器的加載,Tabbar和Nav控制器的加載等

根據(jù)個(gè)人經(jīng)驗(yàn)做出一些優(yōu)化建議:

這一階段的優(yōu)化主要是減少didFinishLaunchingWithOptions方法里的時(shí)間制轰,所以我們要確認(rèn)每個(gè)任務(wù)的時(shí)間量(利用CFAbsoluteTimeGetCurrent()方法去計(jì)算前计,計(jì)算方法參考上面),然后找出影響大的去做優(yōu)化(當(dāng)然時(shí)間容許全部?jī)?yōu)化最好)

1.滿足業(yè)務(wù)前提下垃杖,didFinishLaunchingWithOptions在主線程里做的事情越少越好

  • 將三方庫和一些功能延遲執(zhí)行男杈,比如放在首頁的viewDidAppear方法中

  • 將三方庫和一些功能異步執(zhí)行,比如異步檢測(cè)新版本的更新调俘,注冊(cè)推送

  • 避免多余復(fù)雜的計(jì)算伶棒,比如合適的算法減少運(yùn)算量和內(nèi)存消耗

  • 采用性能好的API,輕量級(jí)的對(duì)象

  • 首頁控制器用純代碼方式來構(gòu)建

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末彩库,一起剝皮案震驚了整個(gè)濱河市肤无,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌侧巨,老刑警劉巖舅锄,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異司忱,居然都是意外死亡皇忿,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門坦仍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鳍烁,“玉大人,你說我怎么就攤上這事繁扎♂;模” “怎么了糊闽?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)爹梁。 經(jīng)常有香客問我右犹,道長(zhǎng),這世上最難降的妖魔是什么姚垃? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任念链,我火速辦了婚禮,結(jié)果婚禮上积糯,老公的妹妹穿的比我還像新娘掂墓。我一直安慰自己,他們只是感情好看成,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布君编。 她就那樣靜靜地躺著,像睡著了一般川慌。 火紅的嫁衣襯著肌膚如雪吃嘿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天窘游,我揣著相機(jī)與錄音唠椭,去河邊找鬼跳纳。 笑死忍饰,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的寺庄。 我是一名探鬼主播艾蓝,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼斗塘!你這毒婦竟也來了赢织?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤馍盟,失蹤者是張志新(化名)和其女友劉穎于置,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贞岭,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡八毯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瞄桨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片话速。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖芯侥,靈堂內(nèi)的尸體忽然破棺而出泊交,到底是詐尸還是另有隱情乳讥,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布廓俭,位于F島的核電站云石,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏研乒。R本人自食惡果不足惜留晚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望告嘲。 院中可真熱鬧错维,春花似錦、人聲如沸橄唬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽仰楚。三九已至隆判,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間僧界,已是汗流浹背侨嘀。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留捂襟,地道東北人咬腕。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像葬荷,于是被迫代替她去往敵國(guó)和親涨共。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容