高德APP啟動(dòng)耗時(shí)剖析與優(yōu)化實(shí)踐(iOS篇)-創(chuàng)新互聯(lián)

前言
最近高德地圖APP完成了一次啟動(dòng)優(yōu)化專項(xiàng),超預(yù)期將雙端啟動(dòng)的耗時(shí)都降低了65%以上,iOS在iPhone7上速度達(dá)到了400毫秒以內(nèi)。就像產(chǎn)品們用后說(shuō)的,快到不習(xí)慣。算一下每天為用戶省下的時(shí)間,還是蠻有成就感的,本文做個(gè)小結(jié)。

主要從事網(wǎng)頁(yè)設(shè)計(jì)、PC網(wǎng)站建設(shè)(電腦版網(wǎng)站建設(shè))、wap網(wǎng)站建設(shè)(手機(jī)版網(wǎng)站建設(shè))、自適應(yīng)網(wǎng)站建設(shè)、程序開(kāi)發(fā)、微網(wǎng)站、微信小程序等,憑借多年來(lái)在互聯(lián)網(wǎng)的打拼,我們?cè)诨ヂ?lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)積累了豐富的網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、網(wǎng)絡(luò)營(yíng)銷經(jīng)驗(yàn),集策劃、開(kāi)發(fā)、設(shè)計(jì)、營(yíng)銷、管理等多方位專業(yè)化運(yùn)作于一體,具備承接不同規(guī)模與類型的建設(shè)項(xiàng)目的能力。

高德APP啟動(dòng)耗時(shí)剖析與優(yōu)化實(shí)踐(iOS篇)

高德APP啟動(dòng)耗時(shí)剖析與優(yōu)化實(shí)踐(iOS篇)

(文中配圖均為多才多藝的技術(shù)哥哥手繪)

啟動(dòng)階段性能多維度分析

要優(yōu)化,首先要做到的是對(duì)啟動(dòng)階段的各個(gè)性能緯度做分析,包括主線程耗時(shí)、CPU、內(nèi)存、I/O、網(wǎng)絡(luò)。這樣才能更加全面的掌握啟動(dòng)階段的開(kāi)銷,找出不合理的方法調(diào)用。

啟動(dòng)越快,更多的方法調(diào)用就應(yīng)該做成按需執(zhí)行,將啟動(dòng)壓力分?jǐn)偅涣粝履切﹩?dòng)后方法都會(huì)依賴的方法和庫(kù)的初始化,比如網(wǎng)絡(luò)庫(kù)、Crash庫(kù)等。而剩下那些需要預(yù)加載的功能可以放到啟動(dòng)階段后再執(zhí)行。

啟動(dòng)有哪幾種類型,有哪些階段呢?

啟動(dòng)類型分為:

  • Cold:APP重啟后啟動(dòng),不在內(nèi)存里也沒(méi)有進(jìn)程存在。
  • Warm:APP最近結(jié)束后再啟動(dòng),有部分在內(nèi)存但沒(méi)有進(jìn)程存在。
  • Resume:APP沒(méi)結(jié)束,只是暫停,全在內(nèi)存中,進(jìn)程也存在。

分析階段一般都是針對(duì)Cold類型進(jìn)行分析,目的就是要讓測(cè)試環(huán)境穩(wěn)定。為了穩(wěn)定測(cè)試環(huán)境,有時(shí)還需要找些穩(wěn)定的機(jī)型,對(duì)于iOS來(lái)說(shuō)iPhone7性能中等,穩(wěn)定性也不錯(cuò)就很適合,Android的Vivo系列也相對(duì)穩(wěn)定,華為和小米系列數(shù)據(jù)波動(dòng)就比較大。

除了機(jī)型外,控制測(cè)試機(jī)溫度也很重要,一旦溫度過(guò)高系統(tǒng)還會(huì)降頻執(zhí)行,影響測(cè)試數(shù)據(jù)。有時(shí)候還會(huì)設(shè)置飛行模式采用Mock網(wǎng)絡(luò)請(qǐng)求的方式來(lái)減少不穩(wěn)定的網(wǎng)絡(luò)影響測(cè)試數(shù)據(jù)。最好是重啟后退iCloud賬號(hào),放置一段時(shí)間再測(cè),更加準(zhǔn)確些。

了解啟動(dòng)階段的目的就是聚焦范圍,從用戶體驗(yàn)上來(lái)確定哪個(gè)階段要快,以便能夠讓用戶可視和響應(yīng)用戶操作的時(shí)間更快。

簡(jiǎn)單來(lái)說(shuō)iOS啟動(dòng)分為加載Mach-O和運(yùn)行時(shí)初始化過(guò)程,加載Mach-O會(huì)先判斷加載的文件是不是Mach-O,通過(guò)文件第一個(gè)字節(jié),也叫魔數(shù)來(lái)判斷,當(dāng)是下面四種時(shí)可以判定是Mach-O文件:

  • 0xfeedface對(duì)應(yīng)的loader.h里的宏是MH_MAGIC
  • 0xfeedfact宏是MH_MAGIC_64
  • NXSwapInt(MH_MAGIC)宏MH_GIGAM
  • NXSwapInt(MH_MAGIC_64)宏MH_GIGAM_64

Mach-O主要分為:

  • 中間對(duì)象文件(MH_OBJECT)
  • 可執(zhí)行二進(jìn)制(MH_EXECUTE)
  • VM 共享庫(kù)文件(MH_FVMLIB)
  • Crash 產(chǎn)生的Core文件(MH_CORE)
  • preload(MH_PRELOAD)
  • 動(dòng)態(tài)共享庫(kù)(MH_DYLIB)
  • 動(dòng)態(tài)鏈接器(MH_DYLINKER)
  • 靜態(tài)鏈接文件(MH_DYLIB_STUB)符號(hào)文件和調(diào)試信息(MH_DSYM)這幾種。

確定是Mach-O后,內(nèi)核會(huì)fork一個(gè)進(jìn)程,execve開(kāi)始加載。檢查Mach-O Header。隨后加載dyld和程序到Load Command地址空間。通過(guò) dyld_stub_binder開(kāi)始執(zhí)行dyld,dyld會(huì)進(jìn)行rebase、binding、lazy binding、導(dǎo)出符號(hào),也可以通過(guò)DYLD_INSERT_LIBRARIES進(jìn)行hook。

dyld_stub_binder給偏移量到dyld解釋特殊字節(jié)碼Segment中,也就是真實(shí)地址,把真實(shí)地址寫(xiě)入到la_symbol_ptr里,跳轉(zhuǎn)時(shí)通過(guò)stub的jump指令跳轉(zhuǎn)到真實(shí)地址。dyld加載所有依賴庫(kù),將動(dòng)態(tài)庫(kù)導(dǎo)出的trie結(jié)構(gòu)符號(hào)執(zhí)行符號(hào)綁定,也就是non lazybinding,綁定解析其他模塊功能和數(shù)據(jù)引用過(guò)程,就是導(dǎo)入符號(hào)。

Trie也叫數(shù)字樹(shù)或前綴樹(shù),是一種搜索樹(shù)。查找復(fù)雜度O(m),m是字符串的長(zhǎng)度。和散列表相比,散列最差復(fù)雜度是O(N),一般都是 O(1),用 O(m)時(shí)間評(píng)估 hash。散列缺點(diǎn)是會(huì)分配一大塊內(nèi)存,內(nèi)容越多所占內(nèi)存越大。Trie不僅查找快,插入和刪除都很快,適合存儲(chǔ)預(yù)測(cè)性文本或自動(dòng)完成詞典。

為了進(jìn)一步優(yōu)化所占空間,可以將Trie這種樹(shù)形的確定性有限自動(dòng)機(jī)壓縮成確定性非循環(huán)有限狀態(tài)自動(dòng)體(DAFSA),其空間小,做法是會(huì)壓縮相同分支。

對(duì)于更大內(nèi)容,還可以做更進(jìn)一步的優(yōu)化,比如使用字母縮減的實(shí)現(xiàn)技術(shù),把原來(lái)的字符串重新解釋為較長(zhǎng)的字符串;使用單鏈?zhǔn)搅斜?,?jié)點(diǎn)設(shè)計(jì)為由符號(hào)、子節(jié)點(diǎn)、下一個(gè)節(jié)點(diǎn)來(lái)表示;將字母表數(shù)組存儲(chǔ)為代表ASCII字母表的256位的位圖。

盡管Trie對(duì)于性能會(huì)做很多優(yōu)化,但是符號(hào)過(guò)多依然會(huì)增加性能消耗,對(duì)于動(dòng)態(tài)庫(kù)導(dǎo)出的符號(hào)不宜太多,盡量保持公共符號(hào)少,私有符號(hào)集豐富。這樣維護(hù)起來(lái)也方便,版本兼容性也好,還能優(yōu)化動(dòng)態(tài)加載程序到進(jìn)程的時(shí)間。

然后執(zhí)行attribute的constructor函數(shù)。舉個(gè)例子:

#include <stdio.h>__attribute__((constructor))static void prepare() {
    printf("%s\n", "prepare");
}
__attribute__((destructor))static void end() {
    printf("%s\n", "end");
}void showHeader() { 
    printf("%s\n", "header");
}

網(wǎng)站名稱:高德APP啟動(dòng)耗時(shí)剖析與優(yōu)化實(shí)踐(iOS篇)-創(chuàng)新互聯(lián)
標(biāo)題網(wǎng)址:http://bm7419.com/article4/goeie.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站靜態(tài)網(wǎng)站、手機(jī)網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站導(dǎo)航、App設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營(yíng)