前言:
最近,小編在看戴銘老師的技術分享,感覺收獲很多。基于最近的學習,小編總結了一些App啟動優化上的知識點,并計劃落地一系列App啟動優化的文章。
目錄如下:
iOS App啟動優化(一)—— 了解App的啟動流程
iOS App啟動優化(二)—— 使用“Time Profiler”工具監控App的啟動耗時
iOS App啟動優化(三)—— 自己做一個工具監控App的啟動耗時
上一篇介紹了App的完整啟動流程和優化思路,本篇將介紹如何查看App啟動耗時以及 “使用Xcode內置性能調優工具 Instruments 之 TimeProfiler 監控App各階段耗時”。
一、查看耗時
(1)查看Pre-Main()階段花費的總時間
想查看Pre-Main階段的時間比較簡單。
直接打開Xcode,找到Product
->Scheme
->Edit Scheme
->Run
->Arguments
->Environment Variables
->DYLD_PRINT_STATISTICS
設置為 YES
Run一下,就能看到pre-Main的耗時日志啦~
(2)查看Main()函數后的花費時間
查看Main函數之后的耗時,目前有兩種方案:
方案一:定時抓取主線程方法的調用堆棧,計算一段時間里的方法耗時。(
Xcode
中的Time Profiler
就是使用的這種的方法)方案二:對
objc_msgSend
方法進行hook
,來得到所有方法的耗時。
注:
hook
是指在原有方法開始執行時,換成你指定的方法(用Runtime
的Method Swizzle
/ Facebook開源的fishhook框架)。或在原有方法的執行前后,添加執行你指定的方法。從而達到改變指定方法的目的。
(PS:關于fishhook
,推薦閱讀一篇博客:fishhook原理)
使用方案一的TimeProfiler
查看Main
函數后耗時,方法如圖:
二、Time Profiler的基本使用
第一步,打開工程,連接真機。
(PS:一定要用真機調試,因為模擬器使用的是電腦的CPU,并不能檢測出真正的性能問題。)第二步,打開
Xcode
,Product
->Profile
。
- 第三步,選擇
Time Profiler
。
- 第四步,這時,你會看到Time Profiler的界面。具體說明如下:
- 第五步,根據自己的需要,配置一下
Call Tree
:
注:
1 . Separate by State:按狀態分開,分析數據。
2 . Separate by Thread:按線程分開,分析數據。可找出嚴重消耗資源的線程,特別對于處理和渲染UI的主線程,一旦主線程受到阻塞,一定會造成App的卡頓。
3 . Invert Call Tree:反向顯示調用樹。把調用層級最深的方法顯示在最上面。
4 . Hide System Libraries:隱藏系統級的干擾信息。
5 . Flatten Recursion:合并遞歸。
6 . Top Functions:置頂耗時方法。
- 第六步,找到耗時的方法,并進行針對性優化。
最后,我是站在iOS業界巨人的肩膀上完成了App啟動優化(一)、(二)、(三),感謝戴銘老師精彩的技術分享。
另附上,戴銘老師課程鏈接:《iOS開發高手課》
推薦文章:
iOS App啟動優化(一)—— 了解App的啟動流程
iOS WKWebView的基本使用
Swift 5.1 (4) - 集合類型
iOS 解析一個自定義協議
iOS13 DarkMode適配(二)
iOS13 DarkMode適配(一)
2019蘋果秋季新品發布會速覽
申請蘋果開發者賬號的流程
Sign In With Apple(一)
奇舞周刊