作者:shizhengtao,华为性能调优工具专家

应用的性能优化一直以来都是开发者所面临的一大难题,在2023HDC大会上全新亮相的HarmonyOS NEXT开发者预览版,其中鸿蒙开发套件DevEco Profiler,对应用卡顿这一问题的定位解决又提供了哪些能力呢?本文带你一探究竟。

一、Realtime Monitor,高效发现卡顿问题

Realtime Monitor实时监测应用运行过程中的一系列性能指标,并以可视化面板展示这些指标。开发者使用十分简单,只需在DevEco Profiler工具界面的左上角选择好您要观测的应用进程,这一功能即会自动打开。

 图一 Realtime Monitor

在Realtime Monitor中,您可以看到如下指标项:

①系统性能事件:借助HarmonyOS NEXT自带的性能检测能力,帮助您自动地发现一些与性能、稳定性相关的运行事件。

②系统异常事件:借助HarmonyOS NEXT自带的异常检测能力,帮助您自动地发现一些异常的运行事件。

③前台Ability:检测应用当前在前台显示的UIAbility,当发现异常指标时,您能够快速获知是在哪个UIAbility运行时产生的。

④CPU使用率:检测应用的CPU使用率和系统整体的CPU负载,持续过高的CPU占用往往会带来能耗过高的问题,是需要重点关注的。

⑤内存使用量:检测应用的内存使用量和系统整体的内存负载,如果出现应用内存周期性上涨的情况,很可能有内存泄漏产生了,需要重点关注。

⑥设备FPS:检测设备当前的FPS帧率,当应用界面静止而FPS很高时可能存在过度渲染问题,当应用界面变化大而FPS不高时则可能存在丢帧问题,也就是前面提到的流畅性问题。

⑦设备GPU利用率:检测设备当前的GPU利用率,当FPS帧率不够时,通过GPU利用率和CPU利用率指标的对比,即可做一个初步的定界:瓶颈是在GPU侧还是在CPU侧。

⑧器件能耗:检测应用使用各个物理器件的耗电量和总耗电量,帮助您快速分析应用当前的耗能分布情况。

借助这些实时的性能指标,您可以快速了解应用进程的运行性能,这样就能在应用产生某些性能问题时快速的发现和定界。

二、场景化分析,直击问题源码行

在DevEco Profiler工具的设计之初,我们便确定了一条核心理念,就是要提供场景化的低门槛调优工具,构建Top-Down式的UX交互设计,引导开发者分析性能数据时能够做到抽丝剥茧、层层递进,而不是一开始便直接陷入到数据海洋的细节之中。这在性能调优领域是十分重要的,我们希望将每一类性能问题背后的故障模型,通过界面设计直观地体现给开发者们。开发者们能够在拿到性能数据的第一时间,便完成对问题的初步定界和判断,然后有的放矢的去分析抓取到的数据,清晰的解决思路是解决性能问题的必备条件之一。除此之外还有极为重要的另一点则是,所有场景我们都希望能帮助开发者直接定位到问题代码行,通过工具定位到瓶颈函数后,可以直接双击函数栈帧,就可以快速在DevEco Studio的编辑器中打开相关源文件,开发者们可以马上进行分析优化。

在8月份HDC大会亮相的DevEco Profiler中,除了已经发布的用于函数热点和内存分析相关的基础调优模板之外,今年为各位开发者们带来了真正体现场景化这一理念的两大高级模板:Launch Insight和Frame Insight。

Launch Insight:全面拆解应用冷启动过程,抓取不同阶段的耗时数据,帮助开发者快速分析冷启动过程的耗时瓶颈。

Frame Insight:记录每一帧的渲染数据,自动标识其中的卡顿帧,并提供同时段的系统Trace信息和函数栈采样数据,帮助开发者高效分析卡顿位置和原因。

接下来,让我们一探Frame模板究竟,看看它到底是如何帮助开发者有的放矢、抽丝剥茧地分析丢帧问题的。

三、Frame Insight,高效定位卡顿问题

上一节我们提过,会将性能问题背后的故障模型直观地体现给开发者,因此在介绍Frame模板之前,首先需要各位开发者们先简单了解一下,在HarmonyOS NEXT中图形渲染的流程是怎样的,如果出现卡顿其可能的阶段和原因是什么。

在HarmonyOS NEXT中,图形系统采用了统一渲染的模式,遵循着一个典型的流水线模式,以60Hz刷新率为例,整个过程如下图二所示,如果是90Hz,每个Vsync的周期就是11.1ms了。

图二 60Hz刷新率渲染流程

在整个渲染流程中,首先是由应用侧响应消费者的屏幕点击等输入事件,由应用侧处理完成后再提交给Render Service,由Render Service协调GPU等资源处理后,在将最终的图像统一送到屏幕上进行显示。聪明的读者想必这个时候已经可以由这个流程推导出相应的故障模式了,就像图三图四所示。

图三 应用卡顿导致丢帧的故障模型图四 Render Service卡顿导致丢帧的故障模型

在整个处理流程中,应用侧和Render Service侧都有可能出现卡顿导致最终用户观测到丢帧的可能,我们分别将这两种情况命名为了AppDeadlineMissed和RenderDeadlineMissed。一般而言,前者可能是应用逻辑处理代码不够高效导致的,后者可能是界面结构过于复杂或者GPU负载过大等原因导致的。这两个故障模型通过我们的Frame模板都可以直观地看到。补充好这些预备知识后,接下来,让我们进入正题。

首先是模板的选择和录制,这一步骤是很简单的。开发者们只需要点几下鼠标,然后在录制期间复现卡顿丢帧场景即可。整个过程如图五所示,在录制期间,DevEco Profiler会使用HarmonyOS NEXT中丰富的DFX工具,自动地为开发者们采集丢帧场景下所需的各类性能数据,录制解析完成之后,就可以展开分析了。

图五 Frame模板录制解析

在录制完成后,您可以观测到一系列数据泳道,如图六所示。

图六 Frame模板数据泳道

①Frame泳道:直观呈现丢帧故障模型对应的性能数据,帮助开发者快速定位到出现卡顿丢帧的时段,并且能够对丢帧原因做一个初步判断。

②ArkTS Callstack泳道:抓取和呈现ArkTS的函数热点,帮助开发者定位ArkTS侧的耗时瓶颈。

③Native Callstack泳道:抓取和呈现Native C++的函数热点,帮助开发者定位Native侧的耗时瓶颈。

④CPU Core泳道:抓取和呈现各个CPU核心的运行细节,帮助开发者定位线程优先级、系统调度等带来的性能问题以及线程实际运行的细节。

⑤System Trace泳道:抓取和呈现各个进程的system trace和user trace,帮助开发者了解查看系统的运行细节,和某些核心任务的准确运行时间。在分析丢帧问题时,首先可以聚焦展开第一条Frame泳道。在这条泳道中,我们抓取了图形渲染过程的一些关键节点信息,并将其可视化了出来,如图七所示。

图七 Frame泳道

①应用帧处理:为您显示了应用侧每一帧的处理耗时,方块的长度即为具体的耗时,绿色的即为在预定周期内完成的帧,红色的则是没有在预定周期内完成的帧

②RenderService帧处理:为您显示了Render Service侧每一帧的处理耗时,条块显示逻辑同应用侧

③提交关系:通过连线的方式,将应用侧提交的帧和Render Service侧接收处理的帧关联起来,并且标有相应标号,您可以立刻观测到这个应用到系统的渲染流程

④期望开始和结束处理时间:通过两根竖线标记了被选择帧,期望开始处理和期望完成处理的时间,一旦超时,您可以借助这两根竖线,去观测同一时间的其他性能数据

⑤详细数据:为您提供被选择的帧的详细数据,通过Corresponding Slice或Preceding Flows的跳转按钮,您可以快速找到对应的详细system trace做进一步分析通过这一条泳道,开发者们可以快速发现丢帧的位置,并完成初步的定界:如果是应用帧处理有红色出现,那需要进一步审视在UI线程中的处理逻辑,是否过于复杂或低效,又或者是被别的什么任务抢占了资源;如果是RenderService帧处理有红色出现,那需要审视是否是界面布局过于复杂。后者可以借助DevEco Studio内的ArkUI Inspector等工具进一步分析,本文不做过多阐述。针对前一种现象我们继续分析。

在找到了处理超时的帧之后,开发者们可以有两种选择,一种是分析system trace,另一种则是分析采样得到的函数热点。前一种方式需要对整个系统和关键的trace点有深入的了解,对于现阶段的开发者们可能还有些困难,所以我们还是建议开发者们直接分析函数热点。分析的方式很简单,找到ArkTS Callstack泳道,框选一下即可。这里有一个小技巧,开发者们可以点击泳道信息区的收藏按钮,将应用帧处理的泳道收藏置顶,如图八所示,可以有效防止上下文信息丢失。

图八 置顶收藏关键泳道

将ArkTS Callstack泳道中红色帧的时段框选起来之后,就可以在下方详情面板中查看到这段时间的函数热点了。我们提供了两种函数热点展现形式供开发者选择,一种是Top-Down形式的一个树状列表,如图九所示;另一种则是许多开发者可能更耳熟能详的火焰图,如图十所示。开发者们可以选择自己习惯的方式去查看。一般来说,如果所选的时间段里,函数栈比较复杂的话,用火焰图找热点会更高效。在这两种形式之外,我们还提供了一个自动查找瓶颈路径的能力,也就是显示在图九和十右侧的部分。当您在左侧Top-Down或火焰图中点击某个具体的函数栈帧结点后,我们会为您计算找到从这个节点往下,最耗时的那条调用路径,当您点击这条调用路径上的函数栈帧时,左侧的图表也会自动展开或聚焦到对应结点上,为您提升瓶颈定位效率。

图九 函数热点Top-Down视图

图十 函数热点火焰图

当锁定到某个热点函数之后,只需要双击函数结点,Profiler工具就会为您自动打开对应的源文件,并Focus到相应代码行。当然了,这里有一个前提,这个源文件须是属于当前工程,并且是在DevEco Studio内完成编译的。

四、验证和迭代优化

通过前述步骤,开发者们应当已经能够定位到瓶颈代码了,但是任务到此还远未结束。您还需要在优化完成后,再次使用工具的前几项能力来验证,一般而言性能优化并不是一件一蹴而就的事,需要循序渐进逐步改进。这需要经验,但更需要耐心,每一次卡顿都很可能是多个子问题共同叠加导致的。这也是性能优化这个任务,往往需要团队内的大牛来进行的原因之一。

当然了,这其实也给我们这些程序员指明了一条升职加薪之路,学会调优,去解决性能问题这种难题,解的多了,自然就成为团队技术骨干了,也希望这篇文章和我们的调优工具DevEco Profiler能为各位开发者的晋升之路带来一些帮助,感谢您的阅读。

鸿蒙开发套件之DevEco Profiler助您轻松分析应用性能问题的更多相关文章

  1. 如此繁荣的移动webapp开发市场:总结当下的一些移动web开发套件

    写在前面: 因为移动市场的盛行带动了移动社交.移动购物.手游.智能化硬件等多个新兴领域.智能终端硬件水平越来越高,运行其上的web浏览器能力也越来越强,加上HTML5\JS\CSS的蓬勃发展,Web已 ...

  2. 【鸿蒙开发板试用报告】用OLED板实现FlappyBird小游戏(中)

    小伙伴们久等了,在上一篇<[开发板试用报告]用OLED板实现FlappyBird小游戏(上)>中,我们本着拿来主义的原则,成功的让小鸟在OLED屏幕上自由飞翔起来,下面我们将加入按钮交互功 ...

  3. 用鸿蒙开发AI应用(八)JS框架访问内核层

    目录:前言JS应用开发框架原理内置模块实现ace模块开发界面程序 前言上回说到,用C++来写UI界面的开发效率不如JS+HTML来的高,但设备开发又免不了要通过内核态来操作硬件,这里我们就要先打通从J ...

  4. 【资源下载】Linux下的Hi3861一站式鸿蒙开发烧录(附工具)

    下载附件 2021春节前夕,华为发布了 HUAWEI DevEco Device Tool 2.0 Beta1,整体提供了异常强大的功能.得知消息后,我在第一时间带着无比兴奋的心情下载尝鲜,但结果却是 ...

  5. 开源物联网框架ServerSuperIO 3.0正式发布(C#),跨平台:Win&Win10 Iot&Ubuntu&Ubuntu Mate,一套设备驱动跨平台挂载,附:开发套件和教程。

    3.0版本主要更新内容: 1.增加跨平台能力:Win&Win10 Iot&Ubuntu&Ubuntu Mate 2.统一设备驱动接口:可以一套设备驱动,跨平台挂载运行,降低人力 ...

  6. 全球首个全流程跨平台界面开发套件,PowerUI分析

    一.       首个全流程跨平台界面开发套件,PowerUI正式发布 UIPower在DirectUI的基础上,自主研发全球首个全流程跨平台界面开发套件PowerUI(PUI)正式发布,PowerU ...

  7. uTenux\AT91SAM3S4C开发套件———硬件电路介绍

    无论写什么嵌入式软件,我们都应该首先对硬件有所了解,这样更有助于我们写出高效精简的程序代码.本次活动我们使用的硬件平台是有悠龙公司提供的uTenux\AT91SAM3S4C开发套件,在悠龙公司的主页可 ...

  8. 旨在脱离后端环境的前端开发套件 - IDT Server篇

    IDT,一个基于Nodejs的,旨在脱离后端环境的前端开发套件,目的就是能让前端开发完全脱离后端的环境,无论后端是什么模板引擎(主流),都能应付自如. IDT主要包括两大部分:Server + Bui ...

  9. 旨在脱离后端环境的前端开发套件 - IDT之Server篇

    IDT,一个基于Nodejs的,旨在脱离后端环境的前端开发套件,目的就是能让前端开发完全脱离后端的环境,无论后端是什么模板引擎(主流),都能应付自如. IDT主要包括两大部分:Server + Bui ...

  10. 基于 Intraweb 和 JQuery 的开发套件

    基于 Intraweb 和 JQuery 的开发套件 http://www.cgdevtools.com/ 开发速度无敌,界面也非常美. 我的web短板终于解决了.....!!!!..!!! 做一个小 ...

随机推荐

  1. 【Azure 存储服务】关于Storage Account Queue使用的几个问题

    1) 在消费Storage Queue中的数据的时候,如何只过滤出 Subject 为"message/{messageid}"这种,去掉subject为"informa ...

  2. Jetpack的ViewModel与LiveData总结

    本文基于SDK 29 一.ViewModel与LiveData的作用: 1.viewModel: 数据共享,屏幕旋转不丢失数据,并且在Activity与Fragment之间共享数据. 2.LiveDa ...

  3. 使用PdfSharp从模板生成Pdf文件

    ​ 最近在做一个生成文档的需求.通过先制作一个包含各字段占位符的文档模板,导入这个模板并填写内容替换掉占位符,再输出成最终文件. 由于版式固定,安全性更好,业务上常用Pdf作为最终标准化的格式, 在. ...

  4. 巧用SQL语句中的OR查询完成业务新需求-2022新项目

    一.业务场景 目前参与开发的项目,之前的一个已上线的版本中有一类查询是根据两张表进行LEFT JOIN查询用来取数据, 主表中有一个字段field用来区分不同的数据类型比如说A/B/C.前面的版本中只 ...

  5. typeorm-model-generator 数据库映射Model 命令 - nest

    typeorm-model-generator 数据库映射Model 命令 NestJs中的控制器.路由.Get.Post方法参数装饰器 https://blog.csdn.net/urwddd/ar ...

  6. GO 语言的并发编程相关知识点简介与测试【GO 基础】

    〇.什么是协程 Coroutines ? 进程和线程太常见,本文就不再赘述了,直接一起看下什么是协程.如下图,先看下协程的定位: 关于用户空间和内核空间:进程运行起来就涉及到对内存资源的管理,然而内存 ...

  7. Ingress和Ingress Controller什么关系

    Ingress Controller和Ingress在Kubernetes(K8s)中各自扮演着不同的角色,但它们共同协作以实现外部访问集群内部服务的功能. Ingress是一个Kubernetes ...

  8. Python Numpy 中的打印设置函数set_printoptions

    一 概述 np.set_printoptions()用于控制Python中小数的显示精度. 二 解析 np.set_printoptions(precision=None, threshold=Non ...

  9. day01-SpringBoot基本介绍

    SpringBoot基本介绍 1.SpringBoot是什么? 官网地址:https://spring.io/projects/spring-boot 学习文档:https://docs.spring ...

  10. 云游长江大桥,3DCAT实时云渲染助力打造沉浸化数字文旅平台

    南京长江大桥是中国第一座自主设计建造的双层公路铁路桥,也是世界上最早的双层公路铁路桥之一.它不仅是一座桥梁,更是一座历史文化的见证者和传承者.它见证了中国人民的智慧和奋斗,承载了中国社会的变迁和发展. ...