启动时间减少了28%!淘票票 iOS 应用启动阶段性能的优化

启动时间减少了28%!淘票票 iOS 应用启动阶段性能的优化_第1张图片

应用的启动性能,作为和用户体验直接关联的重要指标,一直是各大技术团队花时间花精力去钻研优化的部分。由于在应用启动阶段,iOS 系统和应用本身会做很多事情,包括 binary 加载、二方库启动、框架加载、界面渲染等等,这些事情涉及到 iOS 开发的方方面面。所以,一个应用的启动性能如何,能够直接体现技术团队的水准。

淘票票团队经过启动优化专项治理,将启动时间降低了 28.2%。本文将分享在应用点击到应用完成加载这个阶段中,我们的技术优化策略。

一、应用点击到应用完成加载

一般情况下,我们将启动阶段大概分为四个:

1)Pre-Main:加载 binary、静态库等;

2)Main:main.m 中 main 方法执行;

3)ApplicationDidFinish:iOS 系统回调,通知应用以完成启动加载,可以开始界面绘制;

4)界面绘制完成:首界面完全展现在用户设备屏幕上。

这里的阶段范围,涉及到我们这次分享的主要是 Pre-Main 阶段。

考虑是对 Pre-Main 阶段进行优化,实际上这里不太涉及对于代码的处理,因为在这个阶段我们写的代码还没有被真正的运行起来。这个阶段主要的工作都是 iOS 系统在做,系统会将 binary 从安装到本地的.app 文件夹中找出来,通过签名验证 binary 身份,之后将 binary 加载到虚拟内存中。

这部分的优化,我们更多地需要去理解系统行为,在编译这个层级就做好优化准备。

说到理解系统行为,能够去看的东西很多也很少。iOS 操作系统本身是很复杂的,虽然其是一个闭源系统,但 iOS 底层使用的是 Unix,我们可以通过类 Unix 系统,也就是开源的 Linux 的很多系统行为来推测 Unix 的行为,并推测 iOS 的系统行为。但是 iOS 提供的相关文档和接口很少,使得就算是我们理解了一个行为,可能也没有办法将对应处理应用到 iOS 应用上。所以如何在众多可能性中找到那些我们可以做的事情,就比较重要了。

通过一系列的摸索,和调研其他团队的优化经验,启动阶段的 Page Fault 优化进入了我们的视野。

二、PageFault

PageFault 是什么?回答这个问题,我们先要回顾一下现代操作系统的内存处理机制。

1.早期的内存机制

在计算机发展早期,操作系统对于内存处理机制都是有多少内存用多少内存,系统本身的内存地址和操作系统中应用的内存地址在物理内存上都是一一对应的。当你写了一个软件并运行,其中一个变量的地址打印出来是 0x000FF1,那么这个变量的实际储存地址就是物理内存上的 0x000FF1 这个位置。这种原始的内存处理方式,配合 C 语言中自由度极高的指针,带来了很多可能。程序员想要把其他应用在内存中的片段给引用到自己的软件中运行,直接将对应内容地址加载即可。实际上当年很多应用都是这么做的,通过这种手段避免了重复加载运行库的内容。

当然,这么做除了容易导致崩溃之外,还存在另一个比较严重的问题:在计算机蛮荒的时代,内存作为计算机中重要的高 I/O 性能硬件,价格是非常高的。如果操作系统和应用需要将所有运行内容都加载进内存,那么一个 128MB 的软件就会需要 128MB 的物理内存,考虑到操作系统自身的内存占用还会需要更多内存。

为了解决这么一个昂贵的硬件问题,操作系统的内存 Paging 机制被建立了起来。

2.虚拟内存

操作系统开发者发现,当一个应用加载进内存之后,并不是所有的内存内容都会随时被应用使用到。包括操作系统本身在内的应用,被完全加载进内存之后,也不

你可能感兴趣的:(阿里技术,阿里巴巴文娱技术)