iOS原理 App的啟動優(yōu)化1:優(yōu)化建議

iOS原理 文章匯總

基本概念

App的啟動優(yōu)化指的是減少App的啟動時間校镐,啟動方式分為兩種:『冷啟動』和『熱啟動』。

  • 冷啟動:App啟動時,如果在內(nèi)存中沒有App的相關數(shù)據(jù)项栏,必須要從磁盤中重新載入到內(nèi)存中亡资,這種啟動方式叫做冷啟動。在iOS中板驳,殺掉App后重新打開即為冷啟動方式。
  • 熱啟動:App啟動時碍拆,如果內(nèi)存中已包含App的相關數(shù)據(jù)若治,不需要從磁盤中載入慨蓝,這種啟動方式叫做熱啟動。在iOS中端幼,通過home鍵退出App后再打開礼烈,即為熱啟動方式。

一般來說啟動優(yōu)化指的是針對冷啟動方式的優(yōu)化婆跑,啟動時間也分為兩個階段:『main()函數(shù)之前』和『main()函數(shù)之后』济丘。

Main()函數(shù)之前

main()函數(shù)之前pre-main階段,這個階段的啟動時間是沒法自主統(tǒng)計的洽蛀,只能由系統(tǒng)反饋摹迷,在Xcode中通過簡單配置即可查看。

在Xcode中新建一個項目郊供,然后在菜單中峡碉,選擇Product --> Scheme --> Edit Scheme ,找到Run --> Environment Variables驮审,在這里添加一個name為DYLD_PRINT_STATISTICS的環(huán)境變量鲫寄,并將其value設置為1。再運行項目疯淫,即可在console中查看到下面所示的pre-main time地来。

Total pre-main time: 121.09 milliseconds (100.0%)
         dylib loading time:  31.90 milliseconds (26.3%)
        rebase/binding time:  37.44 milliseconds (30.9%)
            ObjC setup time:   6.25 milliseconds (5.1%)
           initializer time:  45.49 milliseconds (37.5%)
           slowest intializers :
             libSystem.B.dylib :   7.99 milliseconds (6.6%)
   libBacktraceRecording.dylib :  10.73 milliseconds (8.8%)
    libMainThreadChecker.dylib :  23.81 milliseconds (19.6%)

從輸出結果可知,pre-main總共耗時123.40ms熙掺,分為如下4個階段:

  • dylib loading:加載動態(tài)庫未斑。

    動態(tài)庫越多,越耗時币绩。

  • rebase/binding:偏移修正和符號綁定蜡秽。

    • rebase(偏移修正):App在編譯時,會生成二進制文件缆镣,在文件內(nèi)部的所有方法和函數(shù)芽突,都記錄了一個偏移地址。在運行時董瞻,系統(tǒng)會為二進制文件分配一個ASLR隨機值(Address Space Layout Randomization寞蚌,地址空間布局隨機化),并將隨機值插入到二進制文件的開頭钠糊,每個方法和函數(shù)加載在內(nèi)存中的真實地址即為:ASLR隨機值 + 偏移值挟秤。這樣,每次運行眠蚂,都會重新分配ASLR隨機值煞聪,都要偏移修正重新加載,這就導致耗時逝慧。

    • binding(符號綁定):在MacOS和iOS中昔脯,方法和函數(shù)并不是直接訪問的啄糙,而是通過其在MachO文件中對應的符號來訪問。比如說云稚,NSLog是存在于Foundation動態(tài)庫的方法隧饼,在編譯期,會在Mach0文件里創(chuàng)建一個與之對應的符號!NSLog静陈,此時符號指向一個無意義的隨機地址燕雁,MacO文件也是存在于磁盤中。然后在運行時鲸拥,MacO文件會被拷貝加載到內(nèi)存中拐格,此時會將NSLog方法在內(nèi)存中的真實地址和符號!NSLog關聯(lián)起來,這就是符號綁定刑赶,在這個過程中也存在耗時捏浊。

  • ObjC setup:OC類的注冊。

    OC類越多撞叨,耗時越久金踪。

  • initializer:執(zhí)行load方法和構造函數(shù)。

    從輸出結果可知這個initializer過程耗時最多的是libSystem.B.dylib牵敷、libBacktraceRecording.dylib以及libMainThreadChecker.dylib這三個動態(tài)庫胡岔。

針對這個階段,優(yōu)化建議如下:

  • 除了系統(tǒng)自帶的動態(tài)庫枷餐,開發(fā)過程中盡量不要自己添加外部動態(tài)庫靶瘸,蘋果官方建議項目中使用的外部動態(tài)庫最好不要超過6個,如果超過6個尖淘,需要合并動態(tài)庫奕锌。
  • 減少自定義的OC類,對于老項目村生,及時刪掉廢棄的類和方法。
  • 盡量少使用+load方法饼丘,將相關操作放在+initialize方法中實現(xiàn)趁桃。
  • 對于swift來說,多使用struct肄鸽。
  • 二進制重排卫病,減少內(nèi)存訪問的耗時。

Main()函數(shù)之后

main()函數(shù)開始至applicationWillFinishLaunching結束典徘,統(tǒng)一稱為main()函數(shù)之后的部分蟀苛。耗時因素主要是以下幾種:

  • 執(zhí)行main()函數(shù)的耗時
  • 執(zhí)行applicationWillFinishLaunching的耗時
  • rootViewController及其childViewController的加載、view及其subviews的加載

這個階段的啟動時間可以自主統(tǒng)計逮诲,根據(jù)各App的業(yè)務代碼來決定帜平。優(yōu)化建議如下:

  • 優(yōu)化代碼邏輯幽告,能懶加載的懶加載,能延遲的延遲裆甩,能放后臺初始化的放后臺冗锁,能使用多線程來初始化的,就使用多線程,嗤栓,盡量不要占用主線程的啟動時間冻河。
  • 盡量使用純代碼來開發(fā),少用Xib或者Storyboard茉帅。
  • 對于比較復雜的首頁叨叙,先加載本地緩存進行顯示,再在數(shù)據(jù)請求成功后更新最新信息堪澎。

推薦閱讀

1. iOS原理 App的啟動優(yōu)化2:二進制重排
2. iOS App 啟動性能優(yōu)化
3. iOS中的動態(tài)庫和靜態(tài)庫

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末摔敛,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子全封,更是在濱河造成了極大的恐慌马昙,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刹悴,死亡現(xiàn)場離奇詭異行楞,居然都是意外死亡,警方通過查閱死者的電腦和手機土匀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門子房,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人就轧,你說我怎么就攤上這事证杭。” “怎么了妒御?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵解愤,是天一觀的道長。 經(jīng)常有香客問我乎莉,道長送讲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任惋啃,我火速辦了婚禮哼鬓,結果婚禮上,老公的妹妹穿的比我還像新娘边灭。我一直安慰自己异希,他們只是感情好,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布绒瘦。 她就那樣靜靜地躺著称簿,像睡著了一般扣癣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上予跌,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天搏色,我揣著相機與錄音,去河邊找鬼券册。 笑死频轿,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的烁焙。 我是一名探鬼主播航邢,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼骄蝇!你這毒婦竟也來了膳殷?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤九火,失蹤者是張志新(化名)和其女友劉穎赚窃,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體岔激,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡勒极,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了虑鼎。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辱匿。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖炫彩,靈堂內(nèi)的尸體忽然破棺而出匾七,到底是詐尸還是另有隱情,我是刑警寧澤江兢,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布昨忆,位于F島的核電站,受9級特大地震影響划址,放射性物質(zhì)發(fā)生泄漏扔嵌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望吆寨。 院中可真熱鬧捻勉,春花似錦、人聲如沸暑诸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寥裂。三九已至嵌洼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間封恰,已是汗流浹背麻养。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留诺舔,地道東北人鳖昌。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像低飒,于是被迫代替她去往敵國和親许昨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

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