iOS APP優(yōu)化之--啟動速度優(yōu)化

針對APP性能優(yōu)化很重要一點在于APP啟動時候啟動速度的優(yōu)化拦止,避免在啟動時處理過多業(yè)務(wù)邏輯導(dǎo)致啟動速度慢哩照,使用戶體驗比較一般弧烤,以下是對了解到的資料做盡可能簡單易懂的整理涧黄。

程序啟動總時間包含:t(App總啟動時間) = t1(main()之前的加載時間) + t2(main()之后的加載時間)。

t1 = 系統(tǒng)dylib(動態(tài)鏈接庫)和自身App可執(zhí)行文件的加載:

App開始啟動后恢恼,系統(tǒng)首先加載可執(zhí)行文件(自身App的所有.o文件的集合)民傻,然后加載動態(tài)鏈接庫dyld,dyld是一個專門用來加載動態(tài)鏈接庫的庫。 執(zhí)行從dyld開始漓踢,dyld從可執(zhí)行文件的依賴開始, 遞歸加載所有的依賴動態(tài)鏈接庫牵署。
動態(tài)鏈接庫包括:iOS 中用到的所有系統(tǒng) framework,加載OC runtime方法的libobjc喧半,系統(tǒng)級別的libSystem奴迅,例如libdispatch(GCD)和libsystem_blocks (Block)。

t2 = main方法執(zhí)行之后到AppDelegate類中的- (BOOL)Application:(UIApplication )Application didFinishLaunchingWithOptions:(NSDictionary )launchOptions方法執(zhí)行結(jié)束前這段時間挺据,主要是構(gòu)建第一個界面取具,并完成渲染展示。

重點: 獲取APP啟動時間—

首先在 main.m 添加如下代碼

CFAbsoluteTime StartTime;

int main(int argc, char * argv[]) {

    StartTime = CFAbsoluteTimeGetCurrent();

然后在 AppDelegate.m 的開頭聲明

extern CFAbsoluteTime StartTime;

最后在AppDelegate.m 的 didFinishLaunchingWithOptions 中添加

dispatch_async(dispatch_get_main_queue(), ^{

    NSLog(@"App啟動時間--%f",(CFAbsoluteTimeGetCurrent()-StartTime));
});

最終打印結(jié)果如下:

啟動時間

啟動時間

一扁耐、調(diào)用main函數(shù)前 編譯加載自身可執(zhí)行文件和動態(tài)鏈接庫dyld以及系統(tǒng)framework等耗時優(yōu)化暇检,

總結(jié)一下:
對于main()調(diào)用之前的耗時我們可以優(yōu)化的點有:

  1. 減少不必要的framework,因為動態(tài)鏈接比較耗時
  2. check framework應(yīng)當設(shè)為optional和required婉称,如果該framework在當前App支持的所有iOS系統(tǒng)版本都存在块仆,那么就設(shè)為required,否則就設(shè)為optional王暗,因為optional會有些額外的檢查
  3. 合并或者刪減一些OC類悔据,關(guān)于清理項目中沒用到的類:{1.刪減一些無用的靜態(tài)變量 2.刪減沒有被調(diào)用到或者已經(jīng)廢棄的方法 3.將不必須在+load方法中做的事情延遲到+initialize中 4.盡量不要用C++虛函數(shù)(創(chuàng)建虛函數(shù)表有開銷)}

二、main函數(shù)調(diào)用之后的加載時間

在main()被調(diào)用之后俗壹,App的主要工作就是初始化必要的服務(wù)科汗,顯示首頁內(nèi)容等。而我們的優(yōu)化也是圍繞如何能夠快速展現(xiàn)首頁來開展绷雏。 App通常在AppDelegate類中的- (BOOL)Application:(UIApplication )Application didFinishLaunchingWithOptions:(NSDictionary )launchOptions方法中創(chuàng)建首頁需要展示的view头滔,然后在當前runloop的末尾,主動調(diào)用CA::Transaction::commit完成視圖的渲染之众。
而視圖的渲染主要涉及三個階段:

  1. 準備階段 這里主要是圖片的解碼
  2. 布局階段 首頁所有UIView的- (void)layoutSubViews()運行
  3. 繪制階段 首頁所有UIView的- (void)drawRect:(CGRect)rect運行
    再加上啟動之后必要服務(wù)的啟動拙毫、必要數(shù)據(jù)的創(chuàng)建和讀取依许,這些就是我們可以嘗試優(yōu)化的地方

因此棺禾,對于main()函數(shù)調(diào)用之后我們可以優(yōu)化的點有:

  1. 不使用xib,直接視用代碼加載首頁視圖
  2. NSUserDefaults實際上是在Library文件夾下會生產(chǎn)一個plist文件峭跳,如果文件太大的話一次能讀取到內(nèi)存中可能很耗時膘婶,這個影響需要評估,如果耗時很大的話需要拆分(需考慮老版本覆蓋安裝兼容問題)
  3. 每次用NSLog方式打印會隱式的創(chuàng)建一個Calendar蛀醉,因此需要刪減啟動時各業(yè)務(wù)方打的log悬襟,或者僅僅針對內(nèi)測版輸出log
  4. 梳理應(yīng)用啟動時發(fā)送的所有網(wǎng)絡(luò)請求,是否可以統(tǒng)一在異步線程請求
  5. 首頁方法對于viewDidLoad以及viewWillAppear方法中盡量去嘗試少做拯刁,晚做脊岳,不做。

聲明下這里有借鑒到今日頭條iOS客戶端啟動速度優(yōu)化:https://techblog.toutiao.com/2017/01/17/iosspeed/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市割捅,隨后出現(xiàn)的幾起案子奶躯,更是在濱河造成了極大的恐慌,老刑警劉巖亿驾,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嘹黔,死亡現(xiàn)場離奇詭異,居然都是意外死亡莫瞬,警方通過查閱死者的電腦和手機儡蔓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來疼邀,“玉大人喂江,你說我怎么就攤上這事∨哉瘢” “怎么了开呐?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長规求。 經(jīng)常有香客問我筐付,道長,這世上最難降的妖魔是什么阻肿? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任瓦戚,我火速辦了婚禮,結(jié)果婚禮上丛塌,老公的妹妹穿的比我還像新娘较解。我一直安慰自己,他們只是感情好赴邻,可當我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布印衔。 她就那樣靜靜地躺著,像睡著了一般姥敛。 火紅的嫁衣襯著肌膚如雪奸焙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天彤敛,我揣著相機與錄音与帆,去河邊找鬼。 笑死墨榄,一個胖子當著我的面吹牛玄糟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播袄秩,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼阵翎,長吁一口氣:“原來是場噩夢啊……” “哼逢并!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起郭卫,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤筒狠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后箱沦,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辩恼,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年谓形,在試婚紗的時候發(fā)現(xiàn)自己被綠了灶伊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡寒跳,死狀恐怖聘萨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情童太,我是刑警寧澤米辐,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站书释,受9級特大地震影響翘贮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜爆惧,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一狸页、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧扯再,春花似錦芍耘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至秃殉,卻和暖如春坝初,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背复濒。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工脖卖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人巧颈。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像袖扛,于是被迫代替她去往敵國和親砸泛。 傳聞我的和親對象是個殘疾皇子十籍,可洞房花燭夜當晚...
    茶點故事閱讀 45,066評論 2 355

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,182評論 25 707
  • 應(yīng)用啟動時間,直接影響用戶對一款應(yīng)用的判斷和使用體驗唇礁。頭條主app本身就包含非常多并且復(fù)雜度高的業(yè)務(wù)模塊(如新聞勾栗、...
    hgl閱讀 438評論 0 0
  • 背景 7月26號我們阿里數(shù)據(jù)iOS端發(fā)布了4.4.0版本,這次版本主要是優(yōu)化了性能盏筐,其中main()階段的啟動耗時...
    半尺塵閱讀 14,255評論 33 220
  • 親愛的朋友围俘, 祝好!不知不覺琢融,二月已經(jīng)過去了一大半界牡,而二零一七年已經(jīng)過去了百分之十三了。小的時候總在幻想自己長大...
    居無所處閱讀 143評論 0 0
  • 我也經(jīng)歷了第一次親人離世漾抬,就在前兩天宿亡。 我的爺爺,勤勞堅強的老人纳令,走了挽荠。春節(jié)期間被檢查出患上癌癥,不到半年的時間就...
    大餅變小了閱讀 148評論 0 1