关键字 | 线程/泳道 | 说明 | 备注 |
|---|---|---|---|
H:originEventHandle code:501 | mmi_service | mmi_service检测到手指离开屏幕。 | |
H:DispatchTouchEvent XXX type=1 | 应用包名 | 应用收到点击离手的事件。 | 应用模块处理起点。 |
H:SendCommands | 应用包名 | 应用发送渲染请求,下方H:MarshRSTransactionData表示提交绘制相关数据给render_service,transactionFlag中包含了应用进程号和序号。 | 应用模块处理终点。 |
H:RSMainThread::ProcessCommandUni[应用进程号,序号] | render_service | render_service处理渲染请求,在接收Vsync信号时执行,应用进程号、序号与应用发送渲染请求的transactionFlag相同。 | render_service处理起点。 |
H:RSHardwareThread::CommitAndReleaseLayers rate: 帧率,now:时间戳 | RSHardwareThread | 将GPU处理的渲染结果提交到显示硬件,now与H:RSMainThread::ProcessCommandUni上方的H:ReceiveVsync中的now字段一一对应。 | render_service处理终点。 |
H:CustomNode:OnAppear | 应用包名 | 执行自定义组件的aboutToAppear方法。 | |
H:CreateTaskMeasure[组件名][self:组件ID][parent:父组件ID] | 应用包名 | 创建组件并执行测量任务。 |
然后以应用收到点击离手事件的Trace点为起点,在上方输入框分别输入H:MarshRSTransactionData、H:RSMainThread::ProcessCommandUni、H:RSHardwareThread::CommitAndReleaseLayers找到应用第一次发送渲染请求、render_service处理渲染请求、render_service提交渲染结果的Trace点。计算Trace关键字的时间间隔,得到mmi_service、应用、render_service各阶段耗时如下图表所示,耗时主要集中在应用部分。
mmi_service | 应用 | 应用->render_service(应用结束点到render_service起始点) | render_service | 总和 |
|---|---|---|---|---|
3.3ms | 251.7ms | 13.2ms | 25.0ms | 293.2ms |
aboutToAppear部分的堆栈信息中可看到执行了XXXPage组件的aboutToAppear函数,该函数中调用了一个load方法较耗时。

组件测量部分的堆栈中可看到有初始化渲染大量组件,组件创建较耗时。

结合前后两者信息可知,在点击返回按钮时,应用创建了XXXPage组件,该组件包含大量子组件,执行aboutToAppear和测量时耗时较多,导致响应慢的问题。
import { taskpool } from '@kit.ArkTS';
import { BusinessError } from '@ohos.base';
// 循环打印模拟耗时任务
@Concurrent
async function timeConsumingTask() : Promise<number> {
console.info('startTask');
for (let i = 0; i < 100000; i++) {
console.info(`number:${i}`);
}
return 1;
}
@Entry
@Component
struct TaskPoolDemoPage {
build() {
RelativeContainer() {
Button('执行耗时任务')
.onClick(() => {
taskpool.execute(timeConsumingTask).then((result: Object) => {
console.info(`result:${result as number}`);
}).catch((error: BusinessError) => {
console.error(`Failed to execute task: errCode is ${error.code}, errMessage is ${error.message}`);
});
})
.alignRules({
center: { anchor: '__container__', align: VerticalAlign.Center },
middle: { anchor: '__container__', align: HorizontalAlign.Center }
})
}
.height('100%')
.width('100%')
}
}