性能问题最麻烦的地方,很多时候不是没有数据,而是数据和现场对不上。曲线在你低头看手机的那几秒里飙了一下,等你抬头,已经掉回去了;等回到工位想复现,手机又不热了。

这篇按 iOS 性能监控里最常见的四类卡点来写:不知道谁在吃资源、数字有了看不出趋势、趋势有了对不上画面、事后再想复盘却拿不出证据。四类各有各的解法,用的还是 KeyMob 里那几个不同的入口。

第一类:不知道谁在吃资源

手机发烫、掉电快,第一反应是打开监控看看谁在跑。KeyMob 的「性能概况」就是干这个的:一张表列出各进程的 Pid、程序名和资源占用,点右上角的开始按钮,数据会持续刷新。

表里默认是 Pid、程序、名称这几列,够用来找"大户"。想看得细一点,可以自定义列,从几十项指标里勾总负载、物理占用、虚拟大小、磁盘读写、平均功耗分这些,常用的列还能固定在左边或者右边。选中一行,点「选择 App」,就只观察这个应用和它相关的进程,不用在一堆系统进程里翻。

我自己的顺序是先按 CPU 或内存排一下,找出排在前面的几个,再看功耗。CPU 高不一定费电,GPU 和网络的账有时候更吓人。表里选中进程还能直接结束,系统进程一般几秒后会被 iOS 自己拉起来,第三方 App 重开一下就行。

这一个入口是完全免费的,不用登录,也没有试用倒计时呢。日常快速定位耗电和发热的元凶,用它就够了。

第二类:数字有了,趋势看不出来

锁定进程之后,下一步是看它什么时候出问题。表格给的是当下,曲线给的是过程,这两个东西不能互相替代。

在「性能图表」里,先点「显示设置」勾指标,再决定是监控整机还是只选某个 App,然后开始监控。可勾的指标有这么几项:

指标 看什么 默认
CPU 系统 / 应用的利用率与核心数 开
内存 物理、剩余、已用、缓存、App 占用 开
卡顿 卡顿频率与严重程度 开
网络 收发数据量与速率 开
磁盘 / 磁盘速率 读写量与读写速率 关
FPS 当前帧率 / 最大帧率 关
GPU 各单元利用率 关
能耗 CPU / GPU / 网络 / 定位等综合能耗 关

别一上来就全勾。曲线挤在一张图里,颜色都分不清,反而看不出问题。我的习惯是分两轮:第一轮只开 CPU、内存、卡顿、网络,看有没有明显的尖峰或持续上涨;第二轮再加上 FPS、GPU 或者磁盘,去验证第一轮留下的怀疑。

看曲线也有个简单的判断:尖峰常常是某个操作触发的,比如进页面、拉列表、解码大图;缓慢爬升更值得警惕,内存或者磁盘一直往上走,十有八九有东西没释放。CPU 和能耗一起看,能区分是算力在忙还是网络、定位在偷电。

iOS 性能监控最容易犯的错,是把某一秒的高值当成问题。CPU 冲到 80% 不一定是坏事,关键看它持续多久、是不是每次都出现在同一个操作上。多跑两遍,能稳定复现再动手优化,比盯着一个瞬时数字猜要靠谱。

没登录的话,每次监控有 60 秒试用,右上角会显示剩余时间。想不限时长地看,得登录并开通会员。60 秒够看一次冷启动的开头,想盯一整段操作流程,还是得把会员开上。

第三类:趋势抓到了,画面对不上

曲线只能告诉你"这里卡了一下",告诉不了你"当时在干什么"。等回头分析,最容易出现的对话就是:这个尖峰是哪一步?我按了什么?

监控进行中,可以在性能图表页调出截图小窗,按设定的间隔自动截图,也可以手动截单张。截图要先开启监控才能用,拍下来的图会跟时间轴对上,哪一秒曲线飙了,翻到同一时刻的截图就知道当时停在哪个页面、哪个弹窗。截图最好在开始操作之前就打开,别等卡了才想起来啊。

复现卡顿时,我一般把间隔设短一点,连续截一组;只验证某个固定动作,就手动在操作前后各截一张。截出来的图不用每张都留,挑曲线异常的那几张就够了。这个功能不复杂,但省掉了"凭记忆回忆当时在干嘛"这一步,尤其是别人把手机递过来说"你帮我看看为什么卡"的时候,真挺有用的啊。

第四类:事后要复盘,拿不出证据

调完一轮,问题解决了,事情其实还没完。下次版本回归、或者同事想知道你当时怎么定位的,光靠一段口头描述不够。

监控结束后点保存,会生成一份性能文件,主文件是 .json,截图放在同级的 screenshots 文件夹里。整个文件夹一起备份,别只拷那个 json,不然图和数据对不上。存的时候顺手把文件名改一下,带上版本号和日期,比如「v1.4.2-冷启动-20261021」。过两周再翻,光看 performance_20261021.json 这种名字,根本想不起来是哪个版本吧。

要回看的时候,在「打开性能文件」里把文件拖进去,或者点打开,曲线和截图都会还原,指标还能通过显示设置切换。优化前后各存一份,用同样的指标、同样的时长跑一遍,两张图放在一起,提升多少是能看出来的。把文件夹发给同事,对方在自己的客户端里也能打开——不过打开性能文件是会员功能,这点得提前说清楚。

监控真正的价值,不在曲线本身,而在曲线能和某一步操作、某一帧画面、某一个版本对上。

和 Xcode、Instruments 比一比

Xcode 的 Debug Navigator 在调试会话里就能看 CPU、内存、能耗和网络,和代码、断点绑在一起,开发阶段最顺手。局限是它跟着 Xcode 走,离开调试会话就看不到了,也不方便把一段过程存下来给别人看。

Instruments 是另一套深度:Time Profiler 看调用栈耗时,Allocations 看内存分配,Core Animation 和 GPU 相关的模板看渲染。要定位到具体哪一行代码慢,还是它更专业。代价是上手门槛高,而且只在 Mac 上跑。

KeyMob 站的位置不太一样:它看的是设备上的整体表现,不用越狱,可以按 App 看,也能监控微信、支付宝、抖音这些小程序;除了性能曲线,还有实时日志、崩溃日志、最长 6 个月的使用记录和能耗记录,Windows、Mac、Linux 上都能用。真要说边界,它不是调用栈级别的分析器,找"慢在哪一行"还得回到 Instruments。

先开性能概况,锁定吃资源的进程;再用性能图表看趋势,指标分两轮开;抓到异常就开截图,把画面留下来;再保存性能文件,复盘和对比都用它。

工具是死的,顺序是活的。先知道自己卡在哪一类,再决定开哪个入口,比把所有功能都点一遍省事得多。性能能复现、能对上、能留存,基本就赢了一半。这套流程跑顺了,性能问题就不再是玄学。