1. 程式人生 > >iOS 優化程式冷啟動時間

iOS 優化程式冷啟動時間

文章目錄
       一、何為冷啟動
       1、冷啟動
       2、熱啟動
       二、冷啟動時間
       1、什麼是冷啟動時間
       2、冷啟動過程做了什麼 
       三、pre-main()階段
       1、pre-main階段載入
       2、pr-main節點時間測量及其優化
       四、main()階段
       1、main()階段載入
       2、main()優化

一、何為冷啟動

1、冷啟動: app第一次啟動的過程(或者app被kill後,重新啟動的過程)。

2、熱啟動: app處於懸掛狀態,被重新切換回app的過程。

二、冷啟動時間

1、什麼是冷啟動時間: 簡而言之,就是使用者點選app的iocn那一刻開始到看到第一個介面的這段時間。

2、冷啟動過程做了什麼

將其劃分為兩部分,一個是pre-main,另一部分是main

1.pre-main階段
    1.1 載入應用的可執行檔案
    1.2 載入動態連結庫載入器dyld(dynamic loader)
    1.3 dyld遞迴載入應用所有依賴的dylib(dynamic library 動態連結庫)
        包括iOS系統的以及APP依賴的第三方庫。
    
2.main階段    
   2.1 dyld呼叫main() 
   2.2 呼叫UIApplicationMain() 
   2.3 呼叫applicationWillFinishLaunching(這個一般用不到)
   2.4 呼叫didFinishLaunchingWithOptions

三、如何查詢冷啟動時間

1、pre-main階段載入
具體的載入步驟如下:
(1)載入dylib,分析每個dylib(大部分是iOS系統的),找到其Mach-O檔案,
開啟並讀取驗證有效性,找到程式碼簽名註冊到核心,
最後對dylib的每個segment呼叫mmap()。

(2)rebase/bind (指標重定向):
dylib載入完成之後,它們處於相互獨立的狀態,需要繫結起來。
在dylib的載入過程中,系統為了安全考慮,引入了ASLR
(Address Space Layout Randomization)技術和程式碼簽名。
由於ASLR的存在,映象(Image,包括可執行檔案、dylib和bundle)會在隨機的地址上載入,
和之前指標指向的地址(preferred_address)會有一個偏差,dyld需要修正這個偏差,來指向正確的地址。
rebase在前,Bind在後。rebase做的是將映象讀入記憶體,修正映象內部的指標

效能消耗主要在IO。**bind做的是查詢符號表,設定指向映象外部的指標,**效能消耗主要在CPU計算

(3)ObjC setup
OC的runtime需要維護一張類名與類的方法列表的全域性表。
dyld做了如下操作:
對所有宣告過的OC類,將其註冊到這個全域性表中;
將category的方法插入到類的方法列表中
檢查每個selector的唯一性
(4)initializer(這是pre-main階段最耗時的部分)
dyld執行APP的初始化函式,呼叫每個OC類的+load方法,呼叫C++的構造器函式(attribute((constructor))修飾),建立非基本型別的C++靜態全域性變數,然後執行main函式。

2、pr-main節點時間測量及其優化
dyld 提供了內建的測量方法, Xcode 中 Edit scheme -> Run -> Auguments 將環境變數 DYLD_PRINT_STATISTICS 設為1或者YES。

# 優化前的
Total pre-main time: 1.4 seconds (100.0%)
         dylib loading time:  28.64 milliseconds (2.0%) 
        rebase/binding time:  41.42 milliseconds (2.9%)
            ObjC setup time:  37.08 milliseconds (2.6%)  
           initializer time: 1.3 seconds (92.4%)

分別做如下優化
(1) 移除不需要用到的動態庫
(2) 移除不需要用到的類, 減少selector、category的數量
(3) 儘量避免在+load方法裡執行的操作,可以推遲到+initialize方法中

# 優化後的
Total pre-main time: 1.1 seconds (100.0%)
         dylib loading time:  22.88 milliseconds (1.9%)
        rebase/binding time:  35.48 milliseconds (2.9%)
            ObjC setup time:  29.95 milliseconds (2.5%)
           initializer time: 1.1 seconds (92.5%)

四、main()階段

1、main()階段載入: main方法執行只有到didFinishLaunchingWithOptions執行結束這段時間。

主要工作就是初始化必要的服務,顯示首頁內容等。而我們的優化也是圍繞如何能夠快速展現首頁來開展。簡要來說,只需要關注這個didFinishLaunchingWithOptions方法即可。
其實在這方法裡面,我們主要是初始化第三方sdk,專案配置,設定根檢視控制器等。
我們可以藉助打點計時器BLStopwatch來度量didFinishLaunchingWithOptions每行程式碼的初始時間。

例如:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{
   NSLog(@"didFinishLaunchingWithOptions 開始執行");
   self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];
   self.window.backgroundColor = [UIColor whiteColor];
   UITabBarController *tabVC = [[UITabBarController alloc] init];
   self.window.rootViewController =  tabVC;
   [self.window makeKeyAndVisible];
    
   BLStopwatch *timer = [BLStopwatch sharedStopwatch];
   [timer start];
   [self initShareSDK];
   [timer splitWithDescription:@"初始化分享SDK"];
   [timer stop];
   NSLog(@"%@",timer.prettyPrintedSplits);
   // #1 初始化SDK: 0.523  這是個假設時間
   return YES;
}

我們可以根據打點最後輸出的時間對我們的工程進行優化。我們的目的是儘快展現第一個頁面給使用者。首頁最好使用春程式碼建立,畢竟用sb還有一次解碼過程

所以,為了優化啟動速度,我們需要對didFinishLaunchingWithOptions必須給任務進行分級分時

* 日誌、統計等必須在 APP 一啟動就最先配置的事件
* 專案配置、環境配置、使用者資訊的初始化 、推送、IM等事件
* 其他 SDK 和配置事件

其實,總結來說,就是必須一進app就必須初始化和可以延遲初始化的。就上例而言,初始化一個SDK需要耗時0.5s,如果在該SDK 不是非必須初始化,可以放HomeVC的viewdidLoad或者viewDidAppear去做又或者需要用到才初始化。

2、main()優化
1、展示的首頁儘量用純程式碼建立,結合快取更加。
2、結合BLStopwatch對啟動服務進行分級分時。
3、對一些非必要的初始化操作,可以放到viewDidAppear,因為到viewDidAppear開始執行的時候,使用者已經看到了APP的首屏,即宣告啟動結束
4、一般僅針對測試版本進行log列印
5、建議超過0.1的都看下,是否有優化空間
6、對didFinishLaunching裡的函式考慮能否挖掘可以延遲載入或者懶載入,

總之:價效比最高的優化階段就是main函式之後的一些邏輯整理,儘量將不需要的耗時操作延遲到首屏展示之後執行。

相關推薦

iOS 優化程式啟動時間

文章目錄 一、何為冷啟動 1、冷啟動 2、熱啟動 二、冷啟動時間 1、什麼是冷啟動時間 2、冷啟動過程做了什麼 三、pre-main()階段 1、p

Android啟動時間優化檢視及啟動時間優化優化

測量Activity 的啟動時間 如何獲得app的啟動時間? 我也在想這個問題。 當我在framework 程式碼上做這類測量的時候,我可以精確的得出我需要的東西。但是非framework 開發者如何從普通構建獲得自己需要的資訊呢? 一 、直接看log 幸運的是,這

ios學習】優化 App 的啟動時間實踐 iOS

前言當用戶按下home鍵的時候,iOS的App並不會馬上被kill掉,還會繼續存活若干時間。理想情況下,使用者點選App的圖示再次回來的時候,App幾乎不需要做什麼,就可以還原到退出前的狀態,繼續為使用者服務。這種持續存活的情況下啟動App,我們稱為熱啟動,相對而言冷啟動就是

Android程式啟動白屏時間較長

Instant Run在我們使用AndroidStudio編譯apk的時候,使用的gradle tool版本較高的話,程式會在啟動的時候去初始化Instant Run,從而導致啟動時間較長,例如: buildscript { repositories {

Android應用優化啟動優化

前言 事件發生在發包上線的前兩天,在某某雲進行移動測試時,提示冷啟動速度低於平均值的問題,之前自己也曾嘗試過優化,但是發現效果並不是很明顯,作為一個有追求的開發者,趁著有點空閒時間,要好好研究一下冷啟動優化問題。 App的啟動流程 我們可以瞭解一下官方文件《App startup time》對App啟動

Android效能測試之啟動時間

          冷啟動是Android效能測試中的重要指標,即應用從程序未建立到完全啟動的時間,一般要求時長<1.5s,過長需要考慮優化。 獲取冷啟動時間的方法: 1.用命令列  adb shell am start

筆記-iOS應用程式啟動過程

程式的啟動 使用Xcode開啟一個專案,很容易會發現一個檔案main.m檔案,此處就是應用的入口。 程式啟動時,先執行main函式,main函式是iOS程式的入口點 內部會呼叫UIApplicationMain函式 UIApplicationMain裡會建立一個UIApplication物

效能優化之App啟動時間

App啟動模式分類 1.冷啟動 冷啟動狀態:系統不存在該應用的程序。啟動應用才能創建出應用的程序。 一般是中應用在開機後或者系統停止後的第一次啟動過程。因為系統和應用在冷啟動時需要做跟多的工作 所以減少

Android效能優化啟動優化

1.什麼是冷啟動[啟動時間比較長]:在應用啟動前,系統沒有該應用的任何程序資訊。2.什麼是熱啟動[啟動時間比較短] :使用者按了返回鍵,又馬上重新啟動了此應用。3.冷啟動會走application這個類,熱啟動就不會走application這個類4.冷啟動流程5.冷啟動優化 

安卓性能優化之計算apk啟動時間

height let 邏輯 第一個 cin 16px box tex 性能 之前有人在知乎提問:“怎麽計算apk的啟動時間?” : 利用Python或者直接用adb命令怎麽計算apk的啟動時間呢?就是計算從點擊圖標到apk完全啟動所花費的時間。比如,對遊戲來說就是點擊遊

android 性能優化 -- 啟動過程 啟動啟動

sdc 視覺 準備 and 接下來 元素 uri word androidm 一、應用的啟動方式   通常來說,啟動方式分為兩種:冷啟動和熱啟動。   1、冷啟動:當啟動應用時,後臺沒有該應用的進程,這時系統會重新創建一個新的進程分配給該應用,這個啟動方式就是冷啟動。   

函數計算性能福利篇(一) —— 系統啟動優化

重要 51cto 說明 rst 計算 alt 代碼 只需要 生成 摘要: 背景 函數計算是一個事件驅動的全托管 serverless 計算服務。使用函數計算構建應用,用戶只需要專註於實現應用層的邏輯實現;服務器等基礎設施的容錯、伸縮以及運維工作由平臺來完成。因此用戶能在很短

成都ios培訓優化app的啟動機制

col .com ESS nag shadow app ado vpd RoCE 成都ios培訓優化app的啟動機制

嵌入式 Linux 啟動時間優化

1 簡介 本章包含的話題有啟動時間的測量、分析、人因工程(human factors)、初始化技術和優化技巧等。 產品花在啟動方面的時間直接影響終端使用者對該產品的第一印象。 一個消費電子裝置不管如何引人注目或者設計得怎麼好,裝置從關機狀態到可互動的使用狀態所需的時間對於獲得正

使用函式 initializer 介面優化深度學習場景下模型載入的啟動延時

背景 深度學習場景使用函式計算典型案例 阿里雲 函式計算 客戶 碼隆科技 是一家專注於深度學習與計算機視覺技術創新的公司。當碼隆的客戶上傳大量影象資料後,需要儘快把影象按照客戶指定的方式處理,包括商品識別,紡織面料等柔性材質識別分析,內容審查,以圖搜圖等等。影象處理基於碼隆預先訓練好的深度學習模型,要求在

函式計算效能福利篇(二) —— 業務啟動優化

繼前一篇《函式計算效能福利篇——系統冷啟動優化》,我們來看看近期函式計算推出的 Initializer 功能帶來的效能優化效果。 背景 函式計算是一個事件驅動的全託管 serverless 計算服務,使用者可以將業務實現成符合函式計算程式設計模型的函式,交付給平臺快速實現彈性高可用的雲原生應用。 使用者

imx6q LINUX 啟動時間優化

1 u-boot的優化   1 首先去掉無關緊要的串列埠資訊   2 將CONFIG_BOOTDELAY改為0   3 去掉一些不用的驅動,例如SPI、USB、HDMI等等   4 關閉CONFIG_CMD_NET   5 U-BOOT會重複初始化M

IdleHandler優化Activity啟動時間

IdleHandler是主執行緒在開始載入頁面完成後呼叫的方法,可以提高效能: @Override protected void onResume() { super.onResume(); Looper.myQueue().addIdleHandler(() ->

Android中APP應用啟動黑白屏原因 優化解決方案

冷啟動 前言 應用啟動 冷啟動流程 問題原因 解決方法 優化 前言 做過APP開發,尤其是複雜專案的同學應該會經歷過APP在桌面點選冷啟動的時候,你以為會順利開啟應用首頁,但是出現在你眼前的

嵌入式linux啟動時間優化

嵌入式系統的啟動速度因裝置的效能和程式碼的質量而異,但總體而言,從消費者的角度考慮,系統的啟動速度肯定是越快越好。因此,對嵌入式系統進行效能優化,加快裝置的啟動時間為專案後期必須進行的一項工作。需要注意的是:嵌入式Linux裝置的優化不是一蹴而就的,而是一個不斷優化,不斷改進的過程