iOS性能优化 启动
為什么80%的碼農都做不了架構師?>>> ??
App啟動過程
-
解析Info.plist
-
加載相關信息,例如如閃屏
-
沙箱建立、權限檢查
-
-
Mach-O加載
-
如果是胖二進制文件,尋找合適當前CPU類別的部分
-
加載所有依賴的Mach-O文件(遞歸調用Mach-O加載的方法)
-
定位內部、外部指針引用,例如字符串、函數等
-
執行聲明為__attribute__((constructor))的C函數
-
加載類擴展(Category)中的方法
-
C++靜態對象加載、調用ObjC的 +load 函數
-
-
程序執行
-
調用main()
-
調用UIApplicationMain()
-
調用applicationWillFinishLaunching
-
測量冷啟動耗時:
冷啟動比熱啟動重要
當用戶按下home鍵的時候,iOS的App并不會馬上被kill掉,還會繼續存活若干時間。理想情況下,用戶點擊App的圖標再次回來的時候,App幾乎不需要做什么,就可以還原到退出前的狀態,繼續為用戶服務。這種持續存活的情況下啟動App,我們稱為熱啟動,相對而言冷啟動就是App被kill掉以后一切從頭開始啟動的過程。我們這里只討論App冷啟動的情況。
main()函數之前
在不越獄的情況下,以往很難精確的測量在main()函數之前的啟動耗時,因而我們也往往容易忽略掉這部分數據。小型App確實不需要太過關注這部分。但如果是大型App(自定義的動態庫超過50個、或編譯結果二進制文件超過30MB),這部分耗時將會變得突出。所幸,蘋果已經在Xcode中加入這部分的支持。
蘋果提供的方法
-
在Xcode的菜單中選擇Product→Scheme→Edit Scheme...,然后找到 Run → Environment Variables →+,添加name為DYLD_PRINT_STATISTICS值為YSE的環境變量。
在Xcode運行App時,會在console中得到一個報告。例如,我在項目中加入以上設置之后,會得到這樣一個報告:
如何解讀
main()函數之前總共使用了2.8s
在2.8s中,加載動態庫用了437.31ms,指針重定位使用了1.6s,ObjC類初始化使用了258.48ms,各種初始化使用了491.03ms。
在初始化耗費的491.03ms中,用時最多的三個初始化是libSystem.B.dylib、libMainThreadChecker.dylib、MediaServices。
多次啟動一般越來速度越快,模擬器。。。。時間就像我這個一樣,,,,,,,,,,,,,很長
main()函數之后
從main()函數開始至applicationWillFinishLaunching結束,我們統一稱為main()函數之后的部分。
這部分可以這么測試在main函數中我們加入如下代碼:
CFAbsoluteTime startTime; int main(int argc, char * argv[]) {@autoreleasepool {startTime = CFAbsoluteTimeGetCurrent();return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));} }在appdelegate中我們在didfinish中加入
extern CFAbsoluteTime startTime; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {NSLog(@"starttime %f",CFAbsoluteTimeGetCurrent() - startTime);return YES; }這樣就會得到這段的時間。
優化部分:
main()函數之前耗時的影響因素
-
動態庫加載越多,啟動越慢。
-
ObjC類越多,啟動越慢
-
C的constructor函數越多,啟動越慢
-
C++靜態對象越多,啟動越慢
-
ObjC的+load越多,啟動越慢
main()函數之后耗時的影響因素
-
執行main()函數的耗時
-
執行applicationWillFinishLaunching的耗時
-
rootViewController及其childViewController的加載、view及其subviews的加載applicationWillFinishLaunching的耗時
優化部分
1. 移除不需要用到的動態庫
2. 移除不需要用到的類
3. 合并功能類似的類和擴展(Category)
4. 壓縮資源圖片
5. 優化applicationWillFinishLaunching
6. 優化rootViewController加載
--盡量避免過多使用+load方法,可以使用+initlalize替代
在系統第一次使用到這個類的使用,才會使用到他的+(void)initlalize方法
--減少- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions里面的操作,在啟動頁出現后再進行相關操作.(例如放到子線程中去執行)
關于每個objc文件的+load函數的執行循序
- 每個objc文件都有+load方法,此處的文件順序,決定了+load的執行順序
作者:找不到工作的iOS
鏈接:https://www.jianshu.com/p/d4b9fa8f2585
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
更多可以參考:
https://mp.weixin.qq.com/s/Kf3EbDIUuf0aWVT-UCEmbA
https://github.com/skyming/iOS-Performance-Optimization
轉載于:https://my.oschina.net/rainwz/blog/1818816
總結
以上是生活随笔為你收集整理的iOS性能优化 启动的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 初学python者自学anaconda的
- 下一篇: WPF Calendar 日历控件 样式