成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

App啟動速度優化看過來

移動開發
總結起來,好像APP啟動速度優化就一句話:讓系統在啟動期間少做一些事。當然我們得先清楚工程里做的哪些事是在啟動期間做的、對啟動速度的影響有多大,然后case by case地分析工程代碼,通過放到子線程、延遲加載、懶加載等方式讓系統在啟動期間更輕松些。

應用啟動流程

iOS應用的啟動可分為pre-main階段和main()階段,其中系統做的事情依次是:

pre-main階段

  • 1.1. 加載應用的可執行文件
  • 1.2. 加載動態鏈接庫加載器dyld(dynamic loader)
  • 1.3. dyld遞歸加載應用所有依賴的dylib(dynamic library 動態鏈接庫)

main()階段

  • 2.1. dyld調用main()
  • 2.2. 調用UIApplicationMain()
  • 2.3. 調用applicationWillFinishLaunching
  • 2.4. 調用didFinishLaunchingWithOptions

啟動耗時的測量

在進行優化之前,我們首先應該能測量各階段的耗時。

[[245149]]

1. pre-main階段

對于pre-main階段,Apple提供了一種測量方法,在 Xcode 中 Edit scheme -> Run -> Auguments 將環境變量DYLD_PRINT_STATISTICS 設為1 。之后控制臺會輸出類似內容:

 

  1. Total pre-main time: 228.41 milliseconds (100.0%) 
  2.          dylib loading time:  82.35 milliseconds (36.0%) 
  3.         rebase/binding time:   6.12 milliseconds (2.6%) 
  4.             ObjC setup time:   7.82 milliseconds (3.4%) 
  5.            initializer time: 132.02 milliseconds (57.8%) 
  6.            slowest intializers : 
  7.              libSystem.B.dylib : 122.07 milliseconds (53.4%) 
  8.                 CoreFoundation :   5.59 milliseconds (2.4%) 

這樣我們可以清晰的看到每個耗時了。

2.main()階段

mian()階段主要是測量mian()函數開始執行到didFinishLaunchingWithOptions執行結束的時間,我們直接插入代碼就可以了。

 

  1. CFAbsoluteTime StartTime; 
  2. int main(int argc, char * argv[]) { 
  3. StartTime = CFAbsoluteTimeGetCurrent(); 

再在AppDelegate.m文件中用extern聲明全局變量StartTime

  1. extern CFAbsoluteTime StartTime; 

***在didFinishLaunchingWithOptions里,再獲取一下當前時間,與StartTime的差值即是main()階段運行耗時。

  1. double launchTime = (CFAbsoluteTimeGetCurrent() - StartTime); 

改善啟動時間

pre-main階段

在這一階段,我們能做的主要是優化dylib

加載 Dylib

之前提到過加載系統的 dylib 很快,因為有優化。但加載內嵌(embedded)的 dylib 文件很占時間,所以盡可能把多個內嵌 dylib 合并成一個來加載,或者使用 static archive。

使用 dlopen() 來在運行時懶加載是不建議的,這么做可能會帶來一些問題,并且總的開銷更大。

Rebase/Binding

之前提過 Rebaing 消耗了大量時間在 I/O 上,而在之后的 Binding 就不怎么需要 I/O 了,而是將時間耗費在計算上。所以這兩個步驟的耗時是混在一起的。

之前說過可以從查看 __DATA 段中需要修正(fix-up)的指針,所以減少指針數量才會減少這部分工作的耗時。對于 ObjC 來說就是減少 Class,selector 和 category 這些元數據的數量。從編碼原則和設計模式之類的理論都會鼓勵大家多寫精致短小的類和方法,并將每部分方法獨立出一個類別,其實這會增加啟動時間。對于 C++ 來說需要減少虛方法,因為虛方法會創建 vtable,這也會在 __DATA 段中創建結構。雖然 C++ 虛方法對啟動耗時的增加要比 ObjC 元數據要少,但依然不可忽視。

Objc setup

大部分ObjC初始化工作已經在Rebase/Bind階段做完了,這一步dyld會注冊所有聲明過的ObjC類,將分類插入到類的方法列表里,再檢查每個selector的唯一性。

在這一步倒沒什么優化可做的,Rebase/Bind階段優化好了,這一步的耗時也會減少。

Initializers

到了這一階段,dyld開始運行程序的初始化函數,調用每個Objc類和分類的+load方法,調用C/C++ 中的構造器函數(用attribute((constructor))修飾的函數),和創建非基本類型的C++靜態全局變量。Initializers階段執行完后,dyld開始調用main()函數。

在這一步,我們可以做的優化有:

  1. 少在類的+load方法里做事情,盡量把這些事情推遲到+initiailize
  2. 減少構造器函數個數,在構造器函數里少做些事情
  3. 減少C++靜態全局變量的個數

main()階段的優化

這一階段的優化主要是減少didFinishLaunchingWithOptions方法里的工作,在didFinishLaunchingWithOptions方法里,我們會創建應用的window,指定其rootViewController,調用window的makeKeyAndVisible方法讓其可見。由于業務需要,我們會初始化各個二方/三方庫,設置系統UI風格,檢查是否需要顯示引導頁、是否需要登錄、是否有新版本等,由于歷史原因,這里的代碼容易變得比較龐大,啟動耗時難以控制。

所以,滿足業務需要的前提下,didFinishLaunchingWithOptions在主線程里做的事情越少越好。在這一步,我們可以做的優化有:

  1. 梳理各個二方/三方庫,找到可以延遲加載的庫,做延遲加載處理,比如放到首頁控制器的viewDidAppear方法里。
  2. 梳理業務邏輯,把可以延遲執行的邏輯,做延遲執行處理。比如檢查新版本、注冊推送通知等邏輯。
  3. 避免復雜/多余的計算。
  4. 避免在首頁控制器的viewDidLoad和viewWillAppear做太多事情,這2個方法執行完,首頁控制器才能顯示,部分可以延遲創建的視圖應做延遲創建/懶加載處理。
  5. 首頁控制器用純代碼方式來構建。

總結

總結起來,好像啟動速度優化就一句話:讓系統在啟動期間少做一些事。當然我們得先清楚工程里做的哪些事是在啟動期間做的、對啟動速度的影響有多大,然后case by case地分析工程代碼,通過放到子線程、延遲加載、懶加載等方式讓系統在啟動期間更輕松些。

責任編輯:未麗燕 來源: 簡書
相關推薦

2013-10-14 14:15:21

程序員讀書

2015-11-30 14:10:49

大無線eLTE華為

2020-11-05 10:57:47

云計算多云公有云

2009-08-05 09:37:11

云計算CIO

2009-10-20 14:10:00

CCIE考試

2015-09-15 09:12:04

程序媛Google特殊獎勵

2013-11-08 17:33:52

2022-05-11 07:17:29

MySQLAnsible運維

2015-02-09 13:48:12

2011-05-27 11:21:58

打印機技巧

2015-02-27 15:14:05

2019-08-08 17:14:31

5G手機華為三星

2017-10-12 12:13:09

設計師搜索功能搜索框

2012-03-31 11:05:00

水冷服務器液體刀片服務器

2019-01-24 10:18:25

機器學習深度學習圖像處理

2013-05-23 11:22:04

Android開發者UI設計Android設計

2020-05-26 15:16:44

5G兩會全息

2020-10-29 12:53:28

JavaScriptTypeScript開發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区在线视频 | 午夜视频在线播放 | 337p日本欧洲亚洲大胆精蜜臀 | 日韩视频一区二区 | 国产成人精品一区二区三区网站观看 | 美女一级黄 | 黄色免费网站在线看 | 自拍偷拍第一页 | 丝袜 亚洲 欧美 日韩 综合 | 日日骚av| 成人在线不卡 | 国产探花在线精品一区二区 | 亚洲天堂中文字幕 | 国产精品一区二区三区久久久 | 国产ts人妖一区二区三区 | www.性色| 久久久网| 久久爱黑人激情av摘花 | 成人福利网 | 欧美日韩国产高清 | 国产精久久久 | 久热久草 | 正在播放国产精品 | 成人国产精品久久 | 亚洲综合一区二区三区 | 黄色视频a级毛片 | 天天综合天天 | 日韩毛片中文字幕 | 精品国产一区二区三区免费 | 亚洲第一视频网 | 一区欧美 | 毛片免费看 | 韩国av一区二区 | 亚洲电影在线播放 | 精品久久精品 | 日日久 | 九九热精品视频在线观看 | 国产高清视频一区 | 久久精品天堂 | 精品在线一区 | 日韩精品1区2区 |