iOS 启动时间度量 & 实验 (XCTest Metrics)

背景介绍

关键字: iOS 性能测试 质量保证明 QA 启动时间

无论是竞品对比、还是公司内部的多个产品的横向比较、某产品的 App 在版本之间的性能监控,都需要有一种标准来衡量性能表现,比如本文要讲述的启动时间。

从点击 App 图标开始,计算到画面渲染个差不多的时候(谜一样的定义),通过高速时间戳录制,来做差计算一个值,成为某版本的启动性能指标。该方法的定义模糊性加上不同人员的操作不可控性,导致测量结果基本无意义,或者说这样的误差已经大于性能发生变化的单位值了,开发也不会信服这样的度量结果。

总之:要度量性能,不要估计性能。 (from WWDC)

之前基于 Instruments 逆向的一些路又弯又长,看到官方发布度量标准简直感激涕零。

WWDC 2019 发布了 XCTest Metrics 相关的一些工具,助力开发者度量 App 的性能。包括 XCTest Metrics, MetricKit, Xcode Metrics Orgnizer. 它们分别针对软件产品的开发、测试、上线等不同阶段进行性能度量。本文首先分享下我本次对于 iOS App 启动过程的学习心得,欢迎大家批评指正。


在 Xcode 11 集成的功能中,菜单栏 Window - Organizer 可以找到下图界面,这里对于 App 的启动时间做了一个条形图展示。

XcodeOrganizer.png

可以看到在 Launch Time 这个标题下面有一行小字:

Time to first frame

意思是展示的时间表示截止到 App 画面的第一帧渲染的时间。这里涉及到一个渲染过程,我们简单看下 WWDC 2019 上展示的 App 启动阶段分析:


App 启动阶段.png

官方 Keynote 十分用心,不同阶段使用不同颜色对应表示,一目了然。可以看到在 400 ms 结束的时候,有一个 Initial Frame Render 过程结束了。App 运行的过程就是一个无限循环的过程(Runloop),每秒 60 帧的流畅定义就是基于这个 frame 的值产生的。当我们 App 绘制出界面的第一帧的时候,其实 App 的整个初始化的过程就完成了。官方基于此开发 Launch Time 性能度量工具。

为什么画面开始渲染的时候就能停止启动性能的度量了呢?
我们来看下这张图:


App 启动周期内的拓展阶段.png

在 Extend 阶段中,App 已经是可交互、有响应、开始显示异步加载的一些网络数据的状态了。比如首页的 Feed 流中的图片列表,可以使用 SDWebimage 等第三方框架进行异步加载。但是这个异步过程与启动过程应当是分开的。

来考虑这样一个场景:

  1. 给 iPhone 网络限速为 5kb/s, 此时首次打开新闻类 App 花费了 30 s 才将所有画面加载完,此时能说启动花费了半分钟么?
  2. 另一个例子,打开一个复杂市区的百度地图场景,前 3 秒出现了主干道路,然后又花费了 5 秒获取到了各种小路和店铺等各种信息。

XCTest Metrics 的基本使用

XCTest Metrics 测量启动时间.png

结果 - 使用小米家庭 App 做个 Demo

通过 xcodebuild 命令行输出和 Xcode 界面运行 XCTest,都可以看到启动时间的运行结果。

小米家庭启动测量结果.png

XCTest Metrics 测量结果为 0.443 s
下面是告诉时间戳的计算结果:

起始点.png
结束点.png

时间差:0.904 - 0.437 = 0.467 s

通过实验对比,发现从系统接收到用户的点击事件(图标变灰),到界面出现第一帧(而不是所有图片加载完),屏幕告诉时间戳计算的差值十分接近 XCTest Metrics 度量结果,仅存的误差应该是人眼判断的第一帧出现时间比实际的第一帧出现时间晚导致的。

通过集成到 Jenkins 可以完成自动化流程,并传入到前端汇总展示,撒花~

一些提示

  1. 启动时间要同时间对比新设备和旧设备。
  2. 可以开启飞行模式或者 mock 网络请求来测试启动性能。
  3. 不要更改 iCloud 账户,防止账户同步影响启动过程
  4. 尽量使用 App Store 等正式版本的安装包。

关于 App 启动方式

  1. 冷启动
    将手机关机,静置2分钟。然后开机后启动某 App。该流程中 App 在内存中是没有初始进程的。
  2. 热启动
    将 App 通过多任务界面杀掉,然后再次打开,依次循环操作。该流程中 App 部分内容是残留在内存中的。
  3. 恢复启动
    按下 Home 按键将 App 放入后台,此时 App 完全在内存中存活,进程也正常存在,再次点击 App 图标。

求点赞,求关注,求动力!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345