日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iOS性能优化 启动

發布時間:2025/5/22 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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性能优化 启动的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。