指标分级 | 时延 |
|---|---|
S标 | 100ms |
A标 | 150ms |
B标 | 250ms |
点击操作响应慢问题相关Trace关键字如下:
关键字 | 线程/泳道 | 说明 | 备注 |
|---|---|---|---|
H:originEventHandle code:501 | mmi_service | 点击应用页面内容离手点 | 多模输入起点 |
H:DispatchTouchEvent id:N, pointX=XXX pointY=XXX type=1 | 应用包名 | 应用收到点击离手的事件 | 多模输入终点,应用模块处理起点 |
H:SendCommands | 应用包名 | 应用发送渲染请求,下方H:MarshRSTransactionData表示提交绘制相关数据给渲染服务,transactionFlag中包含了应用进程号和序号 | 应用模块处理终点 |
H:ABILITY_OR_PAGE_SWITCH | H:ABILITY_OR_PAGE_SWITCH | 页面切换过程 | |
H:RSMainThread::ProcessCommandUni[应用进程号,序号] | render_service | 渲染服务处理渲染请求,在接收Vsync信号时执行,应用进程号、序号与应用发送渲染请求的transactionFlag相同 | 渲染服务处理起点 |
H:RSHardwareThread::CommitAndReleaseLayers rate: 帧率,now:时间戳 | RSHardwareThread | 将GPU处理的渲染结果提交到显示硬件,now与H:RSMainThread::ProcessCommandUni上方的H:ReceiveVsync中的now字段一一对应 | 渲染服务处理终点 |
借助DevEco Profiler Time工具可以查看应用执行的ArkTS代码以及相应耗时,如下图所示,更多详细内容可看基础耗时分析:Time分析。

以点击某应用首页跳转到详情页,点击响应慢问题为例,按整体流程拆分总耗时,确定各模块耗时,具体如下:
接着以该点为起始点,在应用包名泳道中往后查看几ms范围内的Trace关键字H:DispatchTouchEvent XXX type=1,找到应用收到该事件的地方,得到该部分耗时为1.5ms。

手指离开屏幕事件的地方为上述多模输入模块耗时的结束点。应用第一次发送绘制请求的地方可以通过应用收到手指离开屏幕的事件后第一次接收Vsync信号(Trace关键字为H:ReceiveVsync)中发送绘制请求(关键字为H:SendCommands)的结束点来确定,同时该点会在页面切换Trace关键字H:ABILITY_OR_PAGE_SWITCH的起始点附近。

计算应用收到手指离开屏幕的事件和该点之后应用第一次提交绘制请求的时间可确定应用模块处理耗时142.5ms。

渲染服务处理应用发送的渲染请求可以通过应用模块耗时的结束点来确定。在应用包名泳道上方有个Actual Timeline泳道,在应用接收Vsync信号、提交绘制请求处会有对应的一段Trace点(以数字呈现),点击后在下方显示框中点击render_service右侧的跳转箭头可以找到渲染服务处理页面有变化第一帧数据的地方。


然后以render_service这次处理Vsync信号为起点,根据now(时间戳),在RSHardwareThread泳道中找到render_service将该帧GPU处理的渲染结果提交到显示硬件的地方,最终得到渲染服务模块耗时15.7ms。

最终得到如下耗时拆分结果,耗时主要集中在应用模块。
多模输入模块 | 应用 | 应用->渲染服务(应用结束点到渲染服务起始点) | 渲染服务 | 总和 |
|---|---|---|---|---|
1.5ms | 142.5ms | 6.0ms | 15.7ms | 165.7ms |
框选Trace中应用主进程该阶段的运行状态,发现耗时主要在Running部分,查看该阶段的Trace信息,得知其中一部分是加载NewsPage页面,还有另一部分没有Trace点,无法看到在执行什么业务流程。

使用Profiler工具抓取该过程的Trace信息,发现应用在执行dispatchJson方法,该方法耗时占比较多。

查看该阶段应用包名泳道Trace,发现耗时主要在http请求部分。

06-26 10:37:48.275 21779 26289 I C015B0/应用包名/NETSTACK: [http_exec.cpp:418] taskid=-2147483646, size:89, dns:0.073, connect:0.000, tls:0.000, firstSend:0.219, firstRecv:0.000, total:7236.370, redirect:0.000, errCode:0, RespCode:200, httpVer:2, method:POST, osErr:0