2、性能分析工具链:HiTrace、HiProfiler、SmartPerf的使用方法、性能数据采集与分析
性能调优这件事,说白了就是「先找到问题,再解决问题」。但问题在哪?光靠猜可不行。鸿蒙系统给我们准备了三把利器——HiTrace、HiProfiler、SmartPerf。我这些年调优的经验告诉我,这三样东西用好了,性能问题基本无处遁形。
今天我就带大家把这套工具链捋一遍。嗯,咱们从最基础的开始。
2.1 HiTrace:轻量级追踪,定位代码级问题
HiTrace 是什么?你可以把它理解成「代码里的摄像头」。它能记录函数调用、任务切换、消息传递这些细粒度的事件。我习惯在开发阶段就埋好 HiTrace 点,这样线上出问题时,直接看日志就能定位。
核心能力: 轻量、低开销、支持分布式追踪。
2.1.1 基本用法
在代码里埋点,其实就三步:
- 包含头文件
#include "hitrace/trace.h" - 开始追踪:
HiTraceStartTrace(HITRACE_TAG_APP, "myTask"); - 结束追踪:
HiTraceFinishTrace(HITRACE_TAG_APP);
举个例子,你想看看某个网络请求花了多久:
#include "hitrace/trace.h"
void fetchData() {
HiTraceStartTrace(HITRACE_TAG_APP, "fetchData");
// 你的网络请求代码
doHttpRequest();
HiTraceFinishTrace(HITRACE_TAG_APP);
}
跑完之后,用 hitrace 命令就能看到耗时数据。我个人习惯在关键路径上都埋上,比如页面加载、列表渲染、数据库读写。
小技巧: 埋点名称最好用「模块_功能」的格式,比如 "HomePage_LoadData",这样日志一搜就能定位。
2.1.2 数据采集与分析
采集命令很简单:
hitrace --trace_begin app
# 执行你的操作
hitrace --trace_dump > trace.log
hitrace --trace_finish
拿到 trace.log 后,我一般用 grep 过滤关键标签。比如:
grep "fetchData" trace.log
你会看到类似这样的输出:
B|1234|fetchData|1234567890
E|1234|fetchData|1234567990
B 是开始,E 是结束,中间的数字是时间戳。算一下差值,就是耗时。我曾经用这个办法抓到一个第三方 SDK 的卡顿问题——它一个初始化函数跑了 800 毫秒,直接拖慢了应用启动。
2.2 HiProfiler:全场景性能剖析,抓大放小
HiTrace 适合看细节,但如果你想看全局——CPU 占用、内存分配、线程调度——那就得上 HiProfiler 了。这玩意儿是鸿蒙的性能分析大杀器。
2.2.1 使用流程
我一般这么用:
- 打开 DevEco Studio,连接设备
- 点击「Profiler」标签页
- 选择要监控的进程
- 点击「开始录制」
- 操作你的应用
- 点击「停止录制」
录制完成后,你会看到一张时间轴图。上面有 CPU 使用率、内存占用、线程状态、网络请求等。说白了,就是一张「性能心电图」。
2.2.2 关键指标解读
| 指标 | 含义 | 正常范围 | 异常信号 |
|---|---|---|---|
| CPU 使用率 | 进程占用的 CPU 百分比 | < 30% | 持续 > 60% 可能有死循环 |
| 内存占用 | PSS(实际物理内存) | < 200MB | 持续增长可能有内存泄漏 |
| 线程数 | 活跃线程数量 | < 50 | 过多线程导致上下文切换频繁 |
| GC 次数 | 垃圾回收频率 | < 5次/分钟 | 频繁 GC 说明内存分配不合理 |
我记得有一次,一个同事说他的应用滑动卡顿。我打开 HiProfiler 一看,好家伙,CPU 使用率直接飙到 85%,而且有个线程一直在做字符串拼接。优化成 StringBuilder 后,CPU 降到了 15%。
注意: HiProfiler 本身有一定开销,录制时设备可能会发热。建议每次录制不超过 30 秒,抓关键场景就行。
2.3 SmartPerf:自动化性能测试,持续监控
HiTrace 和 HiProfiler 都是「手动挡」,适合开发阶段。但到了测试和线上阶段,你需要的是「自动挡」——SmartPerf 就是干这个的。
2.3.1 核心功能
- 场景录制: 定义测试步骤,比如「打开应用→点击按钮→滑动列表」
- 自动采集: 按预设规则采集 FPS、CPU、内存、温度等
- 报告生成: 自动输出性能报告,标注异常点
2.3.2 实战操作
用 SmartPerf 做一次性能测试,大概是这样:
# 启动 SmartPerf
smartperf start
# 运行你的测试场景
# 比如用 adb 模拟点击
adb shell input tap 500 1000
# 停止并生成报告
smartperf stop --output report.html
生成的报告里,会有一张 FPS 曲线图。如果曲线掉到 30 以下,说明有卡顿。我一般会设置一个阈值:FPS 低于 45 就告警。
我的习惯: 把 SmartPerf 集成到 CI/CD 流水线里。每次提交代码后自动跑一轮性能测试,有问题直接拦截,不让它流到线上。
2.4 三把利器的配合使用
你可能会问:这三个工具到底怎么选?我个人的经验是:
- 开发阶段: 用 HiTrace 埋点,定位具体函数的耗时
- 调优阶段: 用 HiProfiler 看全局,找到瓶颈模块
- 测试/线上: 用 SmartPerf 做自动化监控,防止性能回退
举个例子。有一次应用启动慢,我先用 SmartPerf 跑了一轮,发现启动阶段 CPU 占用很低——说明不是计算密集,而是在等什么。然后用 HiProfiler 看线程状态,发现主线程在等一个锁。最后用 HiTrace 定位到是某个初始化函数里做了同步 I/O。改成异步后,启动时间从 3 秒降到了 0.8 秒。
你看,三个工具各司其职,配合起来才能把问题挖干净。
2.5 避坑指南
最后分享几个我踩过的坑:
- 埋点太多: 我曾经在一个页面里埋了 50 多个 HiTrace 点,结果追踪日志比业务日志还大。建议只埋关键路径,10 个以内就够了。
- 忽略 HiProfiler 开销: 录制时设备温度会升高,CPU 频率可能被限制。我一般会先空跑一次「预热」,再正式录制。
- SmartPerf 阈值设得太松: 默认阈值可能不适合你的场景。比如游戏应用 FPS 要求 60,但工具默认告警是 30。记得根据业务调整。
嗯,工具链就讲到这里。下一章咱们聊聊具体怎么分析这些数据,以及怎么制定优化策略。记住一句话:工具是死的,思路是活的。用好这三把利器,性能问题基本都能搞定。