iOS

iOS-底层原理 34:启动优化(二)优化建议

2021-05-08  本文已影响0人  AcmenL

启动

启动的过程一般是指从用户点击app图标开始到AppDelegate 的didFinishLaunching方法执行完成为止,其中,启动也分为冷启动热启动

而我们这里所说的启动优化,一般是指冷启动情况下的,这种情况下的启动主要分为两部分:

所以,T1+T2的过程 就是 从用户点击App图标到用户能看到app主界面的过程,即需要启动优化的部分

pre-main阶段的优化

通过Edit scheme --> Run--> Arguments添加环境变量DYLD_PRINT_STATISTICS,值设为1

运行程序,打印出如下数据,这些属于main函数之前的时间,也就是pre-main

Total pre-main time: 726.83 milliseconds (100.0%)
         dylib loading time:  39.36 milliseconds (5.4%)
        rebase/binding time:  50.96 milliseconds (7.0%)
            ObjC setup time:  15.55 milliseconds (2.1%)
           initializer time: 620.94 milliseconds (85.4%)
           slowest intializers :
             libSystem.B.dylib :   6.22 milliseconds (0.8%)
    libMainThreadChecker.dylib :  34.21 milliseconds (4.7%)
          libglInterpose.dylib : 416.45 milliseconds (57.2%)
                       Ebusbar : 291.12 milliseconds (40.0%)
Total pre-main time

整个pre-main花费的时间

dylib loading time

动态库的加载时间

优化方案: 我们主要是对自己调用的第三方动态库优化,苹果建议自定义的动态库不要超过6个,我们尽量减少使用自定义的动态库或者合并动态库

rebase/binding time
ObjC setup time

这一步做的主要操作就是类的加载,分类的合并,类越多越耗时

优化方案:合并或者删减一些OC类,关于清理项目中没用到的类,使用工具AppCode代码检查功能,查到当前项目中没有用到的类如下,清除一些没用的静态变量,清除一些没有用到的方法

initializer time

执行load和构造函数的耗时

优化方案:将不必须在+load方法中做的事情延迟到+initialize中,尽量不要用C++虚函数

main函数阶段的优化

在main函数之后的didFinishLaunching方法中,主要是执行了各种业务,有很多并不是必须在这里立即执行的,这种业务我们可以采取延迟加载,防止影响启动时间

main函数阶段的优化建议主要有以下几点:

上一篇下一篇

猜你喜欢

热点阅读