APP项目优化--启动速度优化篇

  我们所开发的项目,随着线上功能逐渐稳定,导致项目启动速度越来越慢,而这又是用户对我们的项目给第一印象,所以启动速度变得尤为重要,如果启动速度缓慢,会造成比较严重的用户流失,所以,对启动速度的优化,将会成为我们后期开发工作中不可或缺的一部分。

 基础概念

  冷启动:是指启动并没有进程在系统里,需要系统新创建一个进程供APP使用的启动情况

  热启动:和冷启动对应,是APP的进程在系统里,用户重新启动进入APP的过程,如果把APP进程杀掉,然后立即重启,也属于热启动因为进程的缓存依然存在

  其实,从用户可感知的维度去看呢,就是用户在手机桌面,点击APP图标,到APP启动图完全消失,首页第一帧渲染完成的过程。所以,本文我们就只展开说APP冷启动的流程和优化。

  启动流程

  总得来说APP启动主要包括三个阶段:

  1、main()函数执行之前

  2、main()函数执行之后

  3、首屏渲染完成后

  关于 APP 启动时间,主要由 pre-main 和 main 之后的时间组成,即总的启动时间 = main 之前加载的时间 + main 之后加载的时间。启动时间越接近 400ms 越好,并且最好控制在 20s 以内,不然系统会以为 APP 进入一个死循环,应用进程将会被系统强制杀除。

  下面我们继续分别说一说这三个阶段系统都做了什么事情。

 main()函数执行前

  在main()函数执行前,系统主要会做下面几件事:

  1. 加载可执行文件(APP的.o文件的集合),就是Mach-o文件,这个在后面会详细介绍
  2. 加载动态链接库,进行rebase指针调整和bind符号绑定
  3. 运行时的初始化工作,包括类的注册,category注册,selector唯一性的检查等
  4. 执行+load()方法,attribute((constructor)) 修饰的函数的调用,创建 C++ 静态全局变量
  pre-main的加载时间,可以通过添加环境变量DYLD_PRINT_STATISTICS的方式打印出来  

 

  运行的时候就可以打印出详细的pre-main的时间 

  

  可以看到main()方法之前的时间由dylib loading ,rebse/binding,ObjC setup和initializer四个耗时的部分组成。

  所以,相对应这个阶段,我们可做的优化工作如下:

  • 减少动态库加载。每个库本身都有依赖,系统会递归的加载所有依赖的动态库,所以苹果公司建议,尽量使用更少的动态库
  • 减少无用的类、分类和方法
  • +load()方法中的内容如非必要,可以放到首屏渲染完成之后再执行,或者放在+initialize() 方法中执行。因为一个+load()方法会带来4毫秒的消耗
  • 控制C++ 静态全局变量的数量

 main()函数执行后

  main()函数执行后,是指从main()函数开始,到appDelegate 的 didFinishLaunchingWithOptions 方法里首屏渲染相关方法执行完成的过程。

  这个过程主要包括了:

  1. 日志、统计
  2. 配置APP运行需要的环境
  3. 第三方SDK初始化

  代码中,各种各样的初始化工作,全部都放在这个阶段去执行了,导致渲染缓慢。这里我们能做的优化工作是,从功能上梳理出来,到底哪些才是首屏渲染必要的初始化功能,哪些是APP启动必要的初始化功能,其他只需要在对应模块功能使用前才需要初始化的工作,分别放在他们对应的合适的位置。

  除此之外,使用 instrument 可以帮助我们进行分析didFinishLaunchingWithOptions中的耗时操作。

 首屏渲染完成后

  到这个阶段,用户已经看到我们APP的首页,这个阶段,所做的事情是其他业务模块的一些初始化工作,也就是appDelegate 的 didFinishLaunchingWithOptions 方法作用域结束的位置。

  所以这个阶段的优化优先级比较低,但是还是要注意,那些会阻塞主线程的操作,以防影响用户后面的操作。

 优化工作

  动态库加载方面

  因为主要的动态库都是系统的动态库,而系统本身对其都有相应的优化处理,所以我们能做的只有去掉无用的系统动态库,或者一步到位直接删除掉Link Binary With Libraries中的所有系统动态库,改为自动link系统动态库

  方法级别的优化

  完成了功能级别的优化后,APP的启动速度应该已经有了一定程度的缩短,下面我们再继续从方法级别去做优化。

  删除无用代码

  当我们的项目日渐壮大,业务线交错的时候,也许已经有了很多无用的冗余代码在里面,我们可以使用AppCode分析检测项目代码。

  检测完就需要手动移除无用代码了,但是注意检测结果并不十分准确,比如可能存在一些runtime映射的方法,也会被检测到,所以还是要人工再检查一遍,以防误删有用代码。

  抽象重复代码

  1、在iOS代码中可能会为同一个类写很多分类方法,由于参与开发同学较多,可能会导致方法重复,但是实际上运行起来只能有一个分类的方法被调用,这取决于哪个分类后被加载,然而编译的二进制代码中,两个方法应该是都存在的,这不仅会增加app体积,也会增加启动时间,所以应该杜绝这样的重复问题;

  2、有很多地方可能是名字不同,但是函数的功能相同,这个不容易被发现,需要大家在写代码的过程中注意;

  3、又或者两个函数名字比较接近,里面有很多相似的代码,这种情况下可以进行相同的代码的提取。

CSDN海神之光上传的代码均可运行,亲测可用,直接替换数据即可,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b或2023b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博客文章底部QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作 功率谱估计: 故障诊断分析: 雷达通信:雷达LFM、MIMO、成像、定位、干扰、检测、信号分析、脉冲压缩 滤波估计:SOC估计 目标定位:WSN定位、滤波跟踪、目标定位 生物电信号:肌电信号EMG、脑电信号EEG、心电信号ECG 通信系统:DOA估计、编码译码、变分模态分解、管道泄漏、滤波器、数字信号处理+传输+分析+去噪(CEEMDAN)、数字信号调制、误码率、信号估计、DTMF、信号检测识别融合、LEACH协议、信号检测、水声通信 1. EMD(经验模态分解,Empirical Mode Decomposition) 2. TVF-EMD(时变滤波的经验模态分解,Time-Varying Filtered Empirical Mode Decomposition) 3. EEMD(集成经验模态分解,Ensemble Empirical Mode Decomposition) 4. VMD(变分模态分解,Variational Mode Decomposition) 5. CEEMDAN(完全自适应噪声集合经验模态分解,Complementary Ensemble Empirical Mode Decomposition with Adaptive Noise) 6. LMD(局部均值分解,Local Mean Decomposition) 7. RLMD(鲁棒局部均值分解, Robust Local Mean Decomposition) 8. ITD(固有时间尺度分解,Intrinsic Time Decomposition) 9. SVMD(逐次变分模态分解,Sequential Variational Mode Decomposition) 10. ICEEMDAN(改进的完全自适应噪声集合经验模态分解,Improved Complementary Ensemble Empirical Mode Decomposition with Adaptive Noise) 11. FMD(特征模式分解,Feature Mode Decomposition) 12. REMD(鲁棒经验模态分解,Robust Empirical Mode Decomposition) 13. SGMD(辛几何模态分解,Spectral-Grouping-based Mode Decomposition) 14. RLMD(鲁棒局部均值分解,Robust Intrinsic Time Decomposition) 15. ESMD(极点对称模态分解, extreme-point symmetric mode decomposition) 16. CEEMD(互补集合经验模态分解,Complementary Ensemble Empirical Mode Decomposition) 17. SSA(奇异谱分析,Singular Spectrum Analysis) 18. SWD(群分解,Swarm Decomposition) 19. RPSEMD(再生相移正弦辅助经验模态分解,Regenerated Phase-shifted Sinusoids assisted Empirical Mode Decomposition) 20. EWT(经验小波变换,Empirical Wavelet Transform) 21. DWT(离散小波变换,Discraete wavelet transform) 22. TDD(时域分解,Time Domain Decomposition) 23. MODWT(最大重叠离散小波变换,Maximal Overlap Discrete Wavelet Transform) 24. MEMD(多元经验模态分解,Multivariate Empirical Mode Decomposition) 25. MVMD(多元变分模态分解,Multivariate Variational Mode Decomposition)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值