首页 > 其他分享 >iOS app启动优化

iOS app启动优化

时间:2024-08-07 16:26:39浏览次数:11  
标签:load 启动 app iOS 耗时 首页 main 优化 加载

app的启动阶段可分为main函数调用前和main函数调用后,分别都做了些什么呢

1、pre-main 阶段

   1)加载应用的可执行文件(自身App的所有.o文件的集合)

   2)加载动态链接器dyld(dynamic loader,是一个专门用来加载动态链接库的库)

   3)dyld递归加载应用所有依赖的动态链接库dylib

   4)Bind & Rebase & Runtime 初始化 

   5)+load 和静态初始化  

如何查看这些阶段的耗时情况呢,需要借助dyld的一些配置参数来获取一些信息。这里我们通过一个DYLD_PRINT_STATISTICS配置来获取pre-main阶段的耗时统计。

Edit Schemes -> Run -> Arguments -> Environment Variables中添加配置:

配置完成后,运行程序看下控制台输出

可以看到main函数之前总共消耗了356.03毫秒,而且列出了每个阶段的耗时占比以及启动时最慢文件,接下来对每个阶段具体分析:

dylib loading time: 动态库加载耗时(121.68ms)。关于动态库的加载,这个是不可避免的,我们能做的就是减少动态库的引用,也可以通过合并动态库,从而减少在pre-main时的加载时间。

rebase/binding: 偏移修正/符号绑定。这个过程由操作系统完成。(ASLR安全机制,在二进制文件头部添加随机值)

ObjC setup: OC类注册以及Runtime 初始化。这也就意味着项目中OC类越多,这里消耗的时间也就会增加。

initializer: 这个阶段指的是+ (void)load,C++构造函数等初始化操作。 这里可以看到用时162.29ms,是所有项最高的。所以这里的优化比较明确:1. 能不使用+load就尽量不要使用,可以将load内部逻辑推迟到initialize时;2. 使用到了load,就尽量不要在内部执行耗时操作;3. 如果混编了C++代码,要尽量减少构造函数中的耗时操作。

可以看出main之前对于我们优化的空间不是很大。但是减少load方法的调用和针对无用代码的下线也是有一定的优化效果。另外,抖音采用的二进制重排方案也可以参考,大致原理通过Clang插桩将启动到第一帧视图展示时用到的符号放在同一张表中,这里不做介绍。

2、main阶段

  1)调用main()

  2)调用UIApplicationMain()

  3)  调用applicationWillFinishLaunching

如何优化:

main 到 didFinishLaunching 结束或者第一个 ViewController 的 viewDidAppear 都是作为 main 之后启动时间的一个度量指标。直接使用全局变量统计打点计算即可,但遇到时间较长需要排查问题时,只有这样粗略的统计两个点的时间并不方便排查,目前比较好的方式就是为把启动任务规范化、粒子化,针对每个任务时长进行打点统计,方便后期问题的定位和优化。

第一步,在 didFinishLaunchingWithOptions 方法里,我们会创建应用的 window,指定首页视图控制器;也会由于业务需要初始化所有第三方库;检查是否需要显示引导页、是否需要登录、是否有新版本等。

第二步,首页控制器视图中的 viewWillDidLoad 中的一些操作,例如设置系统UI风格,网络请求加载数据,也会让页面加载空白时长太长。

所以综合以上两个步骤所做的工作,可以进行以下优化:

1、梳理第三方库,找到可以延迟加载的库,做延迟加载处理,比如放到首页控制器的viewDidAppear方法里。

2、梳理业务逻辑,把可以延迟执行的逻辑,做延迟执行处理。比如检查新版本、注册推送通知等逻辑。

3、避免复杂/多余的计算,另外首页控制器尽量采用纯代码方式来构建以节约耗时。

4、避免在首页控制器的viewDidLoad和viewWillAppear做太多耗时操作,因为这2个方法执行完成,首页控制器才能显示,所以部分可以延迟创建的视图应做延迟创建/懒加载处理。

通过上述两项优化后APP的启动时间基本控制在1秒左右,基本实现秒开(以首页已经出现为参考计算启动时间,真实启动加载完后比这个时间小)我们再来看下使用Xcode编辑器自带性能检测调试工具Instruments后启动时间

标签:load,启动,app,iOS,耗时,首页,main,优化,加载
From: https://blog.csdn.net/weixin_40035526/article/details/140994527

相关文章

  • fiddler - 对模拟器app抓包配置
    1.fiddler部分tools》options中, 这几个配置勾选跟我的一致,端口使用8888 然后导出证书 会导出到桌面 然后pc授信证书 然后重启fiddler 2.模拟器部分将证书拉入模拟器,然后点击证书安装,输入的名称可以随便写然后打开wlan,对wifi的修改代理为手动【模拟器有些......
  • <转载>bios 关机过程
    [CSDNBIOS关机过程](https://blog.csdn.net/robinsongsog/article/details/50993333)热启动,冷启动,关机,这些词相信大家都很熟悉,今天就从BIOS的角度,说说这三种reset具体是怎么实现的。/**Resetthesystem.@paramResetTypewarmorcold@paramResetStatus......
  • 数据结构——线段树优化 学习笔记
    数据结构——线段树优化学习笔记比较基础,因此讲的很快。我们主要关注单点修改、区间查询的线段树,这是应用最广泛的。线段树问题我们以LOJ的这道题为例,例题:LOJ#130.树状数组1:单点修改,区间查询。洛谷上面也有类似的题:P3374【模板】树状数组1。因为洛谷的题的数据范......
  • uniapp Vue3版本使用jweixin-module报错
    把uniapp从Vue2版本选择到Vue3版本编译开发  改用到Vue3使用:varjweixin=require('jweixin-module')会编译报错:requireisnotdefined,没有require模块.改成import的话,由于jweixin-module不支持export写法,所以引入也不能成功1import *asjweixinfr......
  • 优化办公流程,你值得拥有的PDF编辑器推荐
    当我们需要修改、调整或是直接在PDF文件上“动刀”时,一款好用的PDF编辑器简直就是救星啊!今天,我就从咱们职场办公人的角度出发,跟大家分享三款我在编辑PDF文字方面亲测过,觉得相当给力的工具。一、福昕PDF编辑器网址:https://editor.foxitsoftware.cn/这家伙简直就是PDF编辑界......
  • YoloV9改进策略:注意力机制改进|通过iAFF模块优化RepNBottleneck结构,YoloV9性能飞跃|即
    摘要在深度学习和计算机视觉领域,YoloV9以其卓越的目标检测性能赢得了广泛的关注与应用。为了进一步提升YoloV9的识别精度和鲁棒性,我们创新性地在其核心组件——RepNBottleneck模块中引入了迭代注意力特征融合(iAFF)模块。这一改进不仅实现了显著的涨点效果,还展现了在复杂场景......
  • 2024最新Mysql锁机制与优化实践以及MVCC底层原理剖析
    锁机制详解锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除了传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供需要用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一......
  • 2024MySQL最新索引优化实战二
    分页查询优化示例表:CREATETABLE`employees`(`id`int(11)NOTNULLAUTO_INCREMENT,`name`varchar(24)NOTNULLDEFAULT''COMMENT'姓名',`age`int(11)NOTNULLDEFAULT'0'COMMENT'年龄',`position`varchar(20)NOTN......
  • @MapperScan的作用,以及与@Mapper的区别
    @MapperScan的作用@MapperScan的作用:这个注解告诉MyBatis-Spring-Boot-Starter自动扫描指定包(及其子包)下的所有接口。对于扫描到的每个接口,MyBatis会自动创建一个MapperFactoryBean。这个MapperFactoryBean会被注册到Spring容器中。自动IoC管理:通过上述过......
  • 基于SpringBoot+Vue+uniapp的电动车租赁网站(源码+lw+部署文档+讲解等)
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言......