APP启动更快iOS15

手机软件开发 2024-9-11 11:51:08 81 0 来自 中国
之前可以通过设置DYLD_PRINT_STATISTICS = 1 变量在XCode上统计APP启动时间pre-main阶段,但是在XCode13.0 & iOS15之后,通过设置变量的方式在XCode上失效啦;
Instrument: App Launch & Time Profiler 取而代之
Xcode---> Product--->rofile进入到Instrument页面,选择App Launch(如下图:)
双击后,进入到App Launch界面:(如下图)
点击页面左上角赤色按钮,注意选中真机,然后手机会自动启动APP,启动后停止运行
3.png 4.png 可以通过每个具体步调的详情检察具体耗时环境(点击箭头可进入详情页)
可以根据分析数据针对项目环境进行相干步调的优化
二进制重排
iOS15让应用启动更快
什么是dyld? 
Dynamic linker, 动态链接器是每个应用步调的入口,负责让代码预备运行好。以是对dyld的任何改动都会影相应用步调的启动时间。在调用main、运行静态初始化方法大概设置Objc运行时之前,dyld会进行fixups工作(包罗rebase、bind操纵)这些操纵修改了应用步调二进制文件中的指针,以包管在运行时全部地点的有效性。
iOS15中唯一的变革是数据现在由linkedit_data_command引用,这个结构中包罗了第一个节点的偏移量
链式补丁格式(chain fixups)
在iOS15之前,rebase、bind和lazy bind各自存储在一个单独的表中。现在被合并成一个链,链的出发点指针包罗在这个新的加载下令中
应用步调的二进制文件文件被分成几个部门,每个部门都包罗一连串的fixups,这些fixups可以是bind大概rebase(不再有lazy binds)。二进制文件的每个64位rebase[3]位置现在编码它所指向的偏移量,以及下一个fixups的偏移量,结构如下:
struct dyld_chained_ptr_64_rebase
{
uint64_t        target    : 36,    /*用于指针target*/
                     high8     :  8, 
                     reserved  :  7,    // 0s 
                     next      : 12,    /*用于提供下一个fixup偏移量(stride=4)*/
                     bind      :  1;    // Always 0 for a rebase
};
这种非常紧凑的编码意味着遍历链的整个过程就可以覆盖整个二进制文件。在作者的测试中,高出50%的dyld都可以大概被新的格式体系所优化并终极淘汰二进制包的大小,只有少量的元数据被生存下来以引导每个page的第一次fixup
重点顺序题目
明白fixup格式背后的动机,必须相识应用步调最昂贵的操纵之一:page fault。当应用步调启动过程中访问文件体系中的代码时,须要通过一个page fault将其从磁盘文件中带入内存。应用步调二进制文件中的每个16kb范围都被映射到内存中的一个页面。一旦页面被修改,只要应用步调不绝止,它就须要留在RAM中(dirty page)。iOS通过压缩近来没有利用的页面来优化dirty page.
应用步调启动时的fixup须要改变应用步调二进制中的地点,因此整个page都不可制止被标记为dirty。
当利用表结构存储fixup数据时,起首要办理rebase,然后是bind。这意味着rebase须要许多page fault,而且大部门是IO绑定[4]。另一方面,bind所访问的page是rebase所利用的page的30%。
在iOS15中,链式fixup将每个内存page的全部变革合并在一起。Dyld现在可以更快地处置惩罚它,只需调解一次内存,就可以同时完成rebase和bind。这使得像内存压缩器如许的操纵体系功能可以利用链式fixups中的信息,不须要在bind过程中归去解压旧page。这些变革,那么dyld中的rebase功能变成了一个无用的功能。
虽然这一变革只在以iOS15为目的是收效,但仍可以做许多变乱来优化应用步调的启动时间。
Reduce number of dynamic frameworks  淘汰动态框架数量
Reduce app size so less memory pages are used 淘汰应用步调的大小,以淘汰内存也的利用
Move code out of +load and static initializers 移出+load和静态初始化中的代码
Use fewer classes    利用更少的类
Defer work to after drawing the first frame 耽误工作到第一帧绘制之后
以上部门是将上面链接中的部门进行了翻译,感爱好看完备版,可直接看链接
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-10-18 20:29, Processed in 0.199735 second(s), 35 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表