1 DevEco Profiler性能调优概述
应用或元服务运行期间可能出现响应速度慢、动画播放不流畅、列表拖动卡顿、应用崩溃或耗电量过高、发烫、交互延迟等现象,这些现象表明应用或元服务可能存在性能问题。造成性能问题的原因可能是业务逻辑、应用代码对系统API的误用、对ArkTS对象的不合理持有导致内存泄露等,引起对系统资源不合理使用,包括对CPU、内存、网络、文件、GPU、以及其他外设等器件的冗余占用,进而引发性能问题。
通常,进行性能优化主要围绕关键点“降负载”来入手,这包括:
1)永久降负载。即将原本不合理的冗余处理进行彻底清理;
2)临时降负载。即避免在关键时间段内扎堆产生负载。可以考虑采用懒加载等延迟处理机制,错峰运行。
DevEco Profiler提供实时监控(Realtime Monitor)能力,提供全方位的设备资源监测,覆盖系统事件、异常报告、CPU占用、内存占用、实时帧率、GPU使用率以及能耗等多个维度的数据,自顶向下逐层展开分析,并可借助DevEco Profiler跳转到代码位置,结合代码进行白盒分析,明确不合理的负载出现位置,帮助识别性能瓶颈,定界问题所在,提高解决问题的效率。
2 DevEco Profiler工具简介
为了帮助开发者更高效地进行性能问题的分析,DevEco Studio提供了场景化调优工具DevEco Profiler,希望为开发者带来高效、直通代码行的调优体验。
开发者可以使用DevEco Profiler完成不同应用模型和场景下的完整性能数据采集,通过简单的工具操作即可完成数据采集,这些数据将帮助开发者洞悉应用在相应场景下的运行细节。
工具的整体设计也遵循了Top-Down的设计理念和数据展示范式。被采集的数据经由工具分析,会由浅到深的以一条条泳道的形式直观地呈现到界面上,DevEco Profiler提供深入具体函数运行热点、CPU调度细节的分析能力,帮助用户搭建HarmonyOS应用性能模型。
DevEco Profiler聚焦性能分析靶心,围绕着Top-Down的思路深入展开分析;各个局部功能具备高度的整体一致性,方便开发者快速上手其他场景下的类似功能。
注意
- DevEco Profiler工具仅支持对已通过USB连接的真机设备进行调优分析,不支持模拟器调优。
- macOS 12及以上系统版本支持使用DevEco Profiler工具。
- DevEco Profiler界面中可使用“/”快捷键展示全量快捷键说明信息。
三种方式打开Profiler:
- 在DevEco Studio顶部菜单栏中选择“View -> Tool Windows -> Profiler”。
- 在DevEco Studio底部工具栏中单击“Profiler”。
- 按“Double Shift”或者“Ctrl+Shift+A”打开搜索功能,搜索“Profiler”。
2.1 整体界面布局及概念
DevEco Profiler工具的界面分为两大区域:
①会话区:负责调优会话的管理。会话区提供了性能实时监控工具Realtime Monitor来帮助开发者先明确问题场景,完成问题的发现和初步定界。开发者可以在会话区选择待调优的设备、应用及当前应用进程,当前已创建的调优分析任务将在下方以列表的形式展示。
每个会话是一份独立完整的性能数据单位,是由开发者通过一次录制得到的,同一个会话中的各种数据经过工具的处理可以互相关联,而不同会话间的数据,由于来自不同时间段的录制,不会具备关联关系。实时监控本质上也是一种会话,是由实时监控这个场景模板创造而成的。录制会话时需要注意,确保场景复现完整后再结束该次会话的录制。
同时会话区提供Launch、Frame等一系列场景化分析任务类型,帮助开发者有针对性的采集并展示更多更详细的数据,这些数据将会还原对应场景下的应用运行状况。
②数据区:负责性能数据的可视化呈现。包含工具控制栏、时间轴、泳道区域、详情区域,通过不同泳道展示,直观展示调优详情。
2.2 会话区
DevEco Profiler左侧为会话区,可以分为三个部分:
① 调优目标选择区域:选择设备及要分析的应用和进程。
选定被调优的设备、应用包及应用进程作为后续调优会话的分析对象。依次点击设备、应用、进程列表完成选择。选择完成后,若目标正在运行,将自动开启实时监控进行指标的观测。
② 会话列表区域:列出当前已创建的调优分析会话。
单击列表中的会话后,界面右侧数据区将显示其数据内容。选择设备应用和进程后,此处默认显示“Realtime Monitor”任务。
会话区将记录当前所有的会话。每一个会话都会包含:会话的名称(图例中的"Launch")、会话当前状态(图例中的"Recorded")、会话对应的录制时长信息(图例中的"9s 302ms")。会话支持拖拽方式调整顺序。
录制/删除会话:通过鼠标悬停在名称后方的信息图标上,会话所要观测的调优对象的基本信息将会以Tooltip的形式展示。点击会话的右侧的/按钮,开启/停止会话录制,此时工具开始抓取性能数据,开发者可以操作应用复现性能劣化场景;点击将删除该会话。
说明
- 会话区存在两种会话类型:活跃会话和历史会话。活跃会话可在此区域内直接看到,历史会话需要点击界面下方View Successful Sessions前往查看。开发者主动选择新的调优目标后,活跃会话会清空,相关会话进入历史会话。
- 仅成功录制或导入的session可长期存留在任务列表中;录制失败或未启动录制的session,在设备/应用切换时自动从任务列表中清除。
- 会话录制完成出现图标,表示数据处于解析状态,请耐心等待解析完成。
- 支持的最大会话个数(活跃会话个数 +历史会话个数总和,重复不计入)为15个。
数据导出:待数据解析完成后,会话便会进入数据展示状态,将数据可视化的展示到右侧的数据区中。此时可以点击会话面板中出现的数据导出按钮,将录制到的数据导出到本地进行保存,借助这个能力,开发者可以方便的在团队内共享录制到的性能数据,也可以防止采集到的性能数据丢失。
③ 场景化模板选择区域:新建会话的入口,DevEco Profiler提供Launch、ArkUI、Frame、Concurrency、ArkWeb、Network、Time、Allocation、Snapshot、CPU等场景化分析模板,提供对不同性能问题场景的数据分析方案。
:Launch冷启动场景化模板。
:ArkUI卡顿丢帧场景化模板。
:Frame卡顿丢帧场景化模板。
:Concurrency并行并发场景化模板。
:ArkWeb加载丢帧场景化模板。
:Network网络诊断场景化模板。
:Time函数耗时场景化模板。
:Allocation内存泄露场景化模板。
:Snapshot内存快照场景化模板。
:CPU调度场景化模板。
选中任意模板图标,点击下方Create Session按钮,即可创建出一个全新的会话。
数据导入:在③ 场景化模板选择区域,点击Open File按钮,即可选择数据进行导入。当前支持.insight,.htrace, .ftrace,.heapsnapshot,.rawheap, .sys,.perfdata,.nas(包含Native Allocation数据的.htrace文件)文件的导入。
配置Profiler缓存路径:在③ 场景化模板选择区域,点击左上方设置按钮,会弹出文件选择器,设置Profiler缓存文件的保存路径。
2.3 数据区
在数据区域,DevEco Profiler提供了对性能数据的可视化呈现结果。由于每个场景化模板所提供的可视化能力各不相同,本章节会主要就所有模板均通用的能力展开介绍。
整个数据区可以分为五个区域:
① 工具控制栏:提供标记、收藏、离线符号导入、泳道过滤、泳道启动配置项等辅助功能的管理以及会话状态和时间轴的控制能力。
:标记列表按钮,点击后可以看到当前已放置的所有标记。可以查看/跳转到标记描述、时刻,支持修改标记的颜色。
:收藏泳道隐藏/折叠按钮,激活后隐藏/折叠收藏的泳道,置灰时为展示收藏的泳道。
:离线符号导入按钮,点击后可以导入带有调试符号表的Native库,对应的Native函数栈符号将被还原。
:泳道筛选按钮,点击可选择泳道进行过滤。筛选无需录制的泳道,可以降低数据采集本身的开销,但同时会造成数据分析维度的减少。
:泳道启动配置项,点击后展示不同泳道对应的插件启动配置信息。支持将配置信息保存到配置文件,后续使用该类型模板默认生效当前配置。
② 时间轴:提供横向时间轴,用于显示数据时间戳。
③ 标记栏:用于放置标记,能够帮助开发者标记时间点或时间段。
④ 泳道区:泳道图区域。每个场景化模板都会预置一系列泳道单元(例如上图的“Frame”便是一个泳道单元)。泳道单元是整个DevEco Profiler工具内,数据组织的最小独立单元,用于剖析应用某一特定维度的运行数据,每个场景化模板均是由一系列泳道单元组成,每个泳道单元都会呈现某一维度的性能数据。开发者可以查看数据随时间变化的特征,发现数据异常的时间段,支持框选时间段后在详情面板查看对应的细节。
说明
- 每个场景化模板的泳道单元,遵循Top-Down分析原则,越接近顶部的泳道单元,所观测的性能维度越抽象,越顶层;越底部的泳道单元观测的性能维度则越接近于系统底层,建议按照自顶而下的顺序去分析泳道单元呈现的数据内容。
- 同一个泳道单元中,泳道区中主要展示时间维度的性能变化,帮助开发者首先定位出有问题的时间段;进而通过详情区查看该时段各维度的详细数据,分析具体影响性能的参数或属性。
⑤ 详情区:展示详细的数据细节。开发者在泳道区域选择数据之后,以各类表格的形式呈现该时间段内各项详细数据。More面板将对左侧详情区中选中数据进行补充描述。
2.3.1 基本操作
2.3.1.1 开启/关闭会话控制
在数据区,首先可以开启和结束会话的录制,点击工具栏的首个按钮即可,如下图所示分别对应开启录制、结束录制功能,第三个状态则代表录制完成。与在会话区域录制的功能效果一致。
2.3.1.2 时间轴控制
DevEco Profiler工具提供了各种丰富的时间轴操作功能:
:数据全量展示按钮,点击后时间轴尺度自动调整,将展示会话完整时间范围内的数据。
:时间轴调整按钮(快捷键为W或使用Ctrl+鼠标滚轮),点击后时间轴所展示的时长将变小,更多数据细节会呈现。
:时间轴调整按钮(快捷键为S或使用Ctrl+鼠标滚轮),点击后时间轴所展示的时长将变大,更易于观测整体数据趋势。
拖动泳道区域下方的滑条(快捷键为A/D键或使用Shift+鼠标滚轮),开发者可以调整时间轴所示的时间范围;拖动泳道右侧滑条(或者滑动鼠标滚轮),可以调整泳道单元上下滚动。具体快捷键使用方式请参见快捷键。
说明
使用W/A/S/D等纯键盘的快捷键操作,仅在已激活的泳道区域生效。泳道区域中存在亮蓝色的选中边框即为激活状态。
2.3.1.3 查看详情面板
当开发者在泳道区域观察到可疑数据后,便可以通过框选或者点选的方式,将相关详细数据展示到详情面板中。泳道中条块状的数据支持点选查看,在泳道区域鼠标点击拖动再释放完成框选。可以在框选的同时按住Alt键,完成框选后时间轴尺度将会自动适应,整个框选时段会充满整个泳道区域,方便聚焦观察被选择的时段。
由于不同的泳道单元会展示不同维度的数据,因此详情面板展示的数据是来自于泳道区域中被选择的泳道单元。被选中的泳道单元会呈现蓝色,与其他泳道单元有明显差异。此外,当开发者直接选中泳道单元,而未进行框选或点选时,详情面板中会展示整个泳道单元的完整详细数据(效果等同于完整框选该泳道单元)。
2.3.1.4 添加/编辑标记
为了便于开发者记录分析出的关键时间点,DevEco Profiler工具提供了标记功能供开发者使用。
DevEco Profiler支持两种时间标记:
- 单点时间标记:单击需要关注的时间点,添加的时间标记显示为(快捷键为M,颜色可自定义)。
- 时间段时间标记:鼠标框选要关注的时间段,单击该时间段右上角的添加时间段起始标记(快捷键为Shift+M,颜色可自定义),如下图所示。
开发者可以在时间轴下方的标记区域点击放置单个标记,也可以在框选时间段后,点击旗子按钮放置该时间段的标记,如下图所示。
支持使用
“ctrl+, ”向前选中单个标记
“ctrl+. ”向后选中单个标记;
“ctrl+[ ”向前选中时间段的标记,
“ctrl+]”向后选中时间段时间标记。
标记放置完成后,可以通过双击标记按钮,在弹出的标记属性框中修改标记的描述和颜色信息,或者删除标记。
此外,工具还提供了查看不同标记之间时间差的能力,只需要先选中一个标记,再鼠标悬浮在其他标记点上,便可在面板右下角后看到被悬浮的标记点和被选择的标记点的时间差。借助这个能力,开发者能够快速获知一些特定时刻的时间差,这对于分析时间敏感的性能问题尤其有用。
2.3.1.5 收藏泳道单元
在使用工具分析,可能会遇到泳道单元过多,导致想分析的泳道单元间隔过远、分析低效的情况,使用收藏功能,可以帮助开发者将关注的泳道单元提拉到泳道区域的顶端。将鼠标悬停在想要收藏的泳道单元之上,出现收藏图标,点击该按钮即可完成收藏。
再次点击该按钮则取消收藏。此外,由于顶部区域空间有限,工具还提供了压缩泳道的能力,点击泳道中图标,可以将收藏的泳道单元进行折叠。
如果泳道展示不完整,当鼠标悬浮到泳道标题区,会提示该泳道的泳道信息。
如果收藏的是子泳道,当鼠标悬浮到收藏的子泳道标题区,会提示该泳道的父泳道信息。
2.3.1.6 展开/折叠子泳道
工具提供了两种方式展开/折叠子泳道:
1、点击父泳道左边小三角符号。
2、双击父泳道表头区展开泳道。
2.3.1.7 全局搜索
为了帮助开发者迅速查找关心的性能数据,DevEco Profiler工具提供了全局搜索功能。
1. 在搜索框中,开发者可以点击选择想要搜索的泳道单元,再输入相应的搜索内容,回车即可获取结果。
2. 在输入框输入内容前或搜索到结果后,可点击Cc按钮,设置输入的关键字是否忽略大小写,默认为忽略大小写。
3. 搜索结果数量会显示在搜索栏右侧,开发者可以通过点击或者按钮,向前向后查看搜索结果,泳道区域会自动跳转到对应的结果位置并为开发者选中该结果,详情面板中会自动刷新出相应详细数据。
4. 通过点击最右侧的按钮,开发者可以快速查看到搜索的历史记录。
2.3.1.8 离线符号解析
为便于开发者分析Native的函数热点,工具提供了符号导入的能力,开发者可以点击工具控制栏的按钮,选择带有调试信息的so库导入,之后工具会利用此信息,将采集到的函数偏移信息转换为对应的源码符号(包括系统so库,用户自编译的so库,三方库)。
说明
- 离线导入携带符号表信息的so库,需要严格保证与release版本的so库保持同一优化等级(如-O1, -O2, -O3等)。可以在CMakeLists.txt文件中查看或配置编译优化等级。
- 离线导入携带符号表信息的so库,需要尽可能与release版本的so库编译选项保持一致,防止so库起始地址不一致,影响解析正确性。
2.3.1.9 源码跳转
找到问题源码是调优过程中最为关键的一环。针对详情面板中所展示的函数栈帧信息(如下图所示),双击栈帧结点,工具便会在编辑器中打开相关源码文件,并定位到对应行号。此功能正常使用的前提是用于抓取性能数据的应用,是在DevEco Studio所在的开发环境中编译,且相关源文件位置并未改变。
3 使用DevEco Profiler进行性能调优
3.1 流程概览
在开发应用时,开发者会对应用的运行情况有一个预期的指标,当应用在某些方面不能满足预期的指标或者表现不佳时,意味着您的应用可能存在性能问题,需要对应用进行性能优化以达到您的预期。应用的性能优化是一个不断持续的周期性的过程,您需要在应用开发过程中观察应用的运行表现来识别性能瓶颈,通过运行时数据来定界定位性能问题,定位根因后修复代码并验证优化措施的可行性,循环往复直到应用满足您的性能指标。DevEco Profiler也遵循以上流程,在使用DevEco Profiler进行性能优化时,您可以参考以下过程:
- 使用“Realtime Monitor”监控设备的各项资源使用情况,识别定界潜在的性能瓶颈及热点区域,例如CPU占用超过预期、内存异常增大等;
- 创建深度分析任务,通过详细的应用运行时数据,例如perf、内存对象等信息,来分析并定位性能问题出现的根因;
- 根据性能分析的结果优化代码;
- 再次使用“Realtime Monitor”查看各项资源的使用情况是否符合预期,来验证代码修改的可行性。
3.2 实时监控
解决性能问题,首先对当前应用的运行情况以及设备的资源消耗进行监测,以初步确定可能存在的性能问题以及问题出现的位置。
DevEco Profiler提供实时监控(Realtime Monitor)能力,该能力为您提供全方位的设备资源监测,覆盖系统事件、异常报告、CPU占用、内存占用、实时帧率、GPU使用率、温度、电流以及能耗等多个维度的数据,帮助您初步识别性能瓶颈,定界问题所在。
3.2.1 配置并确认设备环境
为了能够正确地监测您的设备资源,首先您需要通过USB完成设备连接,打开“开发者模式”并选择允许“USB调试”,然后通过DevEco Studio将您开发的应用安装到设备上。随后您可以通过如下步骤来查看应用的实时资源使用情况。
- 您可以通过如下三种方式打开DevEco Profiler:
- 在DevEco Studio顶部菜单栏中选择“View -> Tool Windows -> Profiler”。
- 在DevEco Studio底部工具栏中单击“Profiler”。
- 按“Double Shift”或者“Ctrl+Shift+A”打开搜索功能,搜索“Profiler”。
- 在设备上启动您想要监测的应用。
- 在DevEco Profiler界面左上角的设备、应用及进程列表中,选择调优设备及待调优的应用/元服务进程。如果您的设备不止有一个主进程(还存在Extension或者Render进程),那么您需要再手动选择一个您想要监控的进程。
当选择完您需要监控的应用以及进程之后,DevEco Profiler会自动为您打开实时监控(Realtime Monitor)的页面。
3.2.2 实时监控应用,多维度对比识别性能热区
在实时监控界面,设备各项资源的使用情况均以泳道图的形式在时间维度展示,提供系统事件、CPU占用等多维度信息,帮助您识别性能热区。
3.2.2.1 面板整体介绍
- 界面左侧为实时数据展示区域,该区域的数据显示了每一项监测内容的瞬时值,并通过饼图或者仪表盘的形式让您更加直观地观察到各项数据的使用占比以及具体数值。
- 界面右侧则是各项数据随着时间推移的变化趋势,通过不同的图像形式(直方图、柱状图、折线图等)来更加清晰的展示某一项资源在一段时间范围内的变化趋势,以帮助您快速判断性能热点区域。
整个实时监控页面从上到下,依次展示了系统事件、异常事件、前台应用、CPU占用、内存占用、帧率、GPU使用率、温度、电流以及能耗等各个维度的数据,帮助从多个维度来对比识别当前应用的性能热区。
3.2.2.2 泳道简介
① System Events泳道:该泳道展示了时间窗内系统事件的起始、终止等状态的统计情况。泳道内存在三种形状的标识:
- 菱形:表示事件开始。
- 正方形:表示事件结束。
- 圆形:表示当前为时间点事件,无持续时间。
② Anomaly泳道:用于展示设备侧上报的各种异常事件。
③ Foreground Ability泳道:用于展示应用/元服务的Ability状态。当Ability在前台运行时,会在此时间段内显示该Ability的名称;若当前无前台运行的Ability,则此时间段内显示“Background”。
④ CPU泳道:左侧饼图展示了当前时刻应用/元服务的CPU使用率、其他进程的CPU使用率以及空闲情况。右侧的泳道图则展示了时间窗内的整体CPU使用情况,其中灰色的部分代表系统中其他进程的CPU占用,蓝色部分则展示了当前应用/元服务的CPU占用情况。
⑤Memory泳道:左侧饼图展示了当前时刻应用/元服务的内存占用、其他进程的内存占用以及未使用的内存。右侧的泳道图则展示了时间窗内的整体内存使用情况,其中灰色的部分代表系统中其他进程的内存占用,蓝色部分则展示了当前应用/元服务的内存占用情况。
⑥FPS泳道:左侧仪表盘展示了当前设备屏幕的帧率瞬时值,红色、黄色、绿色区域则代表当前屏幕帧率是否达标理想状态。右侧柱状图则展示了每一次采集设备帧率时的数值。
⑦GPU泳道:左侧仪表盘展示了当前设备GPU使用率的瞬时值,右侧泳道则展示了时间窗内的整体GPU使用率。
⑧Temperature泳道:左侧温度计显示了当前设备温度信息,右侧泳道的数据采集周期为3秒,展示了时间窗内的设备温度信息以及温度等级。
⑨Device Current泳道:左侧展示了当前设备最大电流、平均电流以及最新的电流值,右侧泳道则展示了时间窗内的设备电流信息。
⑩Energy泳道:该泳道包含了各项部件(包括CPU、Display、GPU、Location、Camera、Bluetooth、Flashlight、Audio、Wifi、Modem)的周期内平均功耗占比。通过图例上方的下拉多选框则可以勾选您想要监控的功耗使用情况的应用,选择多个应用后,该泳道会展示所有您所选择应用的功耗总和。右侧区域柱状图则展示了时间窗内各部件资源的实时使用情况,柱状图的颜色代表每种部件的功耗占比。
说明
FPS、GPU显示的是所使用设备的实时信息,而非当前调优应用/元服务的信息。
3.2.3 实时监控页面的常用操作交互方式
实时监控页面除了展示各个维度数据的瞬时值以及时间窗内的变化趋势之外,还提供了多种交互方式以供协助您更加便捷、快速、细致地分析您的数据。
- 启停控制
点击会话区“Realtime Monitor”页签上的、按钮来即时控制实时监控界面的录制状态。
- 详细数据展示
将鼠标悬浮于所关心的泳道数据上时,界面上会出现当前时间点的时间标线以及含有当前时间点上泳道详细数据的Tooltips。更进一步,当您将鼠标悬浮于时间轴之上时,实时监控页面内的所有泳道均会以Tooltips展示出该时刻的数据
- 图例选择
实时监控界面部分泳道内的图例均支持选择/反选来增加/去除泳道内这一数据的展示,内容改变后泳道内的数据会自动缩放以适应泳道的高度,能够更加专注地分析所关心的数据。
-
至此,通过分析实时监控的多维度设备数据,可以了解到当前设备的具体运行情况以及可能出现性能问题的热点区域。接下来,可以通过深度录制更加详细的设备侧运行数据来更加详尽地分析应用可能存在的性能问题。
3.3 深度录制
开发者可针对不同的性能问题场景选择不同模式的分析任务,对应用/元服务进行深度分析。当前支持以下调优场景为:
- Launch:主要用于分析应用/元服务的启动耗时,分析启动周期各阶段的耗时情况、核心线程的运行情况等,协助开发者识别启动瓶颈。
- ArkUI :主要用于定位由于组件耗时、页面布局、状态变量更新导致的卡顿问题。
- Frame:主要用于深度分析应用/元服务的卡顿丢帧原因。
- Concurrency:主要用于显示并行并发应用的实际运行情况,用于帮助优化并行并发代码。
- ArkWeb:主要用于定位web应用加载和丢帧问题。
- Network: 主要用于定位http协议栈网络信息诊断,用于网络请求分段耗时分析。
- Time:主要用于改进函数执行效率的分析,深度录制函数调用栈及每帧耗时等相关运行数据,并完整展现ArkTS到Native的跨语言调用栈,支撑Native API典型问题分析。
- Allocation:主要用于应用/元服务内存资源占用情况的分析,可深度采集内存相关数据,直观呈现不同分类的内存趋势,提供内存实例分配的调用栈记录,深入分析内存问题。
- Snapshot:支持多次拍摄ArkTS堆内存快照,分析单个内存快照或多个内存快照之间的差异,定位ArkTS的内存问题。
- CPU:通过深度采集CPU内核相关数据,直观地呈现出当前选择调优应用/元服务进程的CPU使用率、CPU各核心时间片调度信息、CPU各核心频率信息、CPU各核心使用率信息、系统各进程的CPU使用情况、线程状态及Trace信息等。
1. 选择场景模板,创建会话:
新建任务的入口,DevEco Profiler提供Launch、ArkUI、Frame、Concurrency、ArkWeb、Network、Time、Allocation、Snapshot、CPU等场景化分析任务类型。
:在设备列表中选择设备。
:在进程列表中选择要调测的应用(可以是正在运行的应用,也可以是已安装但未启动的应用)。
:在DevEco Profiler主界面的新建任务区域,单击要创建的场景调优分析任务类型,并单击“Create Session”。创建后的分析任务,会显示在界面左侧的任务列表中。
:调优详情,显示具体的调优内容。
2. 配置并确认会话环境:
在右边录制详情区域,工具控制栏上有很多小图标,鼠标放上去会有一些功能提示,可以添加一些录制选项,各泳道区域也有下拉框选项,下拉选择不同的设置可以调整录制功能。
3. 启动录制,复现性能劣化场景:
单击任务窗口左上角的 启动录制,也可以选择左侧的任务列表中的,启动录制后,等待任务状态由“initializing”变为“recording”。录制过程中整个DevEco Profiler不能再点击其他的模板进行操作,如果想录制其他模板可以结束本次录制重新选择其他模板开始录制。
4. 录制场景结束,停止录制:
在调优设备侧操作APP,执行要验证的操作,复现设备性能问题。单击该任务的停止按钮
,进入数据分析阶段,所有泳道任务状态由“analyzing”变为“rendering”,分析结束,右侧调优详情区域显示具体调优内容,分析过程可能包含大量的数据,需要等待一段时间,请耐心等待解析完成。
当前的ArkTS Callstack/Callstack/Native Allocation/ArkTS Allocation泳道录制如果无值,泳道显示No Data,在泳道名称处可将光标悬浮于三角告警图标处,查看泳道报错的原因。
4 基础耗时分析:Time分析
4.1 函数耗时分析及优化
开发应用或元服务过程中,如果遇到卡顿、加载耗时等性能问题,开发者通常会关注相关函数执行的耗时情况。DevEco Profiler提供的Time场景分析任务,可在应用/元服务运行时,展示热点区域内基于CPU和进程耗时分析的调用栈情况,并提供跳转至相关代码的能力,使开发者更便捷地进行代码优化。
在设备连接完成后,可按照如下方法查看耗时分析结果:
1. 请参考模块级build-profile.json5文件,增加strip字段并赋值为false。采集函数栈解析符号需要附带符号表信息,无符号表信息可能采集不到函数名称,或ArkTS Callstack泳道无法关联到Native调用栈,因此请录制模板前按照下图进行配置。
2. 创建Time任务并录制相关数据,操作方法可参考性能问题定位:深度录制。或在会话区选择Open File,导入历史数据。
Time分析任务支持在录制前单击指定要录制的泳道:
- User Trace:用户自定义打点泳道,基于时间轴展示当前时段内用户使用hiTraceMeter接口自定义的打点任务的具体运行情况。
- ArkTS Callstack:方舟运行时函数调用泳道,基于时间轴展示CPU使用率和虚拟机的执行状态,以及当前调用栈名称和调用类型。由于隐私安全政策,已上架应用市场的应用不支持录制此泳道。
调用栈分类从语言层面分为ArkTS、NAPI以及Native,从归属层面分为开发者代码以及系统代码。从这两个方面可以将调用栈类型归类如下:
- ArkTS:程序正在执行ArkTS代码;
- NAPI:程序正在运行的NAPI代码;
- Native:程序正在执行的Native代码;
其中每一个类型的亮色和灰色分别代表开发者和系统的代码。
- Callstack:ArkTS和Native混合函数调用泳道。基于时间轴展示各线程的CPU使用率,以及在一段时间内的混合调用栈。调用栈类型会分为开发者或系统的ArkTS以及Native代码两类。由于隐私安全政策,已上架应用市场的应用不支持录制此泳道。
说明
Callstack基于采样模式采集数据,默认采样间隔是500微秒。耗时小于500微秒的函数,Details区域时间相关数据可能存在误差,可通过录制过程中多次触发该函数,根据其耗时百分比判断是否为热点函数。
- Energy:展示应用能耗的构成,结合应用生命周期,识别潜在能耗问题。
说明
- 在任务分析窗口,可以通过“Ctrl+鼠标滚轮”缩放时间轴,通过“Shift+鼠标滚轮”左右移动时间轴。或使用快捷键W/S放大或缩小时间轴,使用A键/D键可以左右移动时间轴。
- 将鼠标悬停在泳道任意位置,可以通过M键添加单点时间标签。
- 鼠标框选要关注的时间段,可以通过“Shift+M”添加时间段时间标签。
- 在任务分析窗口,可以通过“ctrl+, ”向前选中单点时间标签,通过“ctrl+. ”向后选中单点时间标签。
- 在任务分析窗口,可以通过“ctrl+[ ”向前选中时间段时间标签,通过“ctrl+]”向后选中时间段时间标签。
- 将鼠标置于泳道任意位置,可查看到对应时间点的CPU使用率。
- 单击任意泳道名称后方的可将其置顶。
3. 在“ArkTS Callstack”泳道、“ArkTS Callstack”子泳道或“Callstack”子泳道上长按鼠标左键并拖拽,框选要展示分析的时间段。
Details区域会显示所选时间段内的函数栈耗时分布情况,Heaviest Stack区域会展示出“Details”区域选择节点所处的耗时最长的完整调用栈。
其中函数栈耗时分布有两种展现方式:
- 默认为Call Tree方式,其中“Weight”字段表示当前函数的总执行时间,“Self”字段表示函数自身的执行时间,两者之差为当前函数所调用的子函数执行时间之和,“Average Duration”字段表示函数自身的平均执行时间,“Category”字段表示函数调用类型。
- 打开页面下方的Flame Chart开关,函数调用栈将以火焰图的形式展示。其中,横轴表示函数的执行时长,纵轴表示调用栈的深度。
说明
- 火焰图条块支持搜索,搜索结果不匹配的条块会被置灰。
- “Ctrl+鼠标滚轮”的操作,或单击该区域右上角的、可放大和缩小火焰图的时间轴比例,单击可恢复时间轴比例为初始状态。
- “Shift+鼠标滚轮”的操作可左右横向调整可视区间,单独操作滚轮可上下纵向调整可视区间。
- 选中节点,单击该区域右上角的,点击添加面包屑。添加面包屑后,该节点成为根节点,耗时占比为100%,子节点的耗时占比相对于该节点重新计算。
- 在火焰图中选中任一节点,使用“Alt+左键”可将该节点左置底并将其占比放大到100%,其上从属节点按同比例放大显示。该快捷操作同样适用于列表方式,用于将指定节点置顶并截取所属下级节点。
4. 在Callstack泳道上长按鼠标左键并拖拽,框选要展示分析的时间段。
- Summary列表展示框选时段内,所有Native线程的CPU占用率的峰值、谷值、平均值。
- Callstack列表展示框选时段内,所有Native线程的函数热点。
- 悬浮到节点,显示以此节点为根按钮,点击添加面包屑。添加面包屑后,该节点成为根节点,耗时占比为100%,子节点的耗时占比相对于该节点重新计算。
5. ( 可选)在Details中双击需要优化的节点(例如耗时超过预期),可快速跳转至对应工程源码,为开发者节省定位代码路径的时间。
说明
- Release应用暂不支持跳转到用户侧Native代码。
- 静态链接的系统库无法支持源码跳转。如libunwind.a,在编译过程中该系统库会以静态链接的方式集成。该系统库的符号信息在调用栈中会被识别成用户侧定义的函数,实际上无法跳转到源码。
4.2 多实例函数热点分析
在应用开发过程中,可能存在一些耗时操作,则需要引入Worker线程或者TaskPool任务池来协同处理。这些线程也可能会像主线程一样存在性能问题,所以需要同时对这些子线程进行性能调优。其中,主线程以及每一个Work线程或者TaskPool工作线程,都会对应一个方舟实例,通过连接这些方舟实例,开启性能采样,从而可以获取更全面的采样信息。
- 父泳道内可以看到被选择进程的CPU使用率,框选后展示此时段内录制到的所有方舟实例的函数栈信息。
- 子泳道框选后展示此时段内录制到的该方舟实例的函数栈信息。
4.3 离线符号解析
DevEco Profiler提供离线符号解析能力,基于携带符号表信息的so库进行分析,可把符号地址解析为具体函数名称,便于定位函数位置。
对于有so库路径和偏移地址的采样数据,如图所示,通过导入对应的携带符号表信息的so库进行解析,补充release so库中缺失的符号表信息(包括系统so库,用户自编译的so库,三方库)。
您可以通过点击工具栏按钮,导入包含debug信息的so库。
说明
- 离线导入携带符号表信息的so库,需要严格保证与release版本的so库保持同一优化等级(如-O1, -O2, -O3等)。可以在CMakeLists.txt文件中查看或配置编译优化等级。
- 离线导入携带符号表信息的so库,需要尽可能与release版本的so库编译选项保持一致,防止so库起始地址不一致,影响解析正确性。
4.3 查询自定义打点信息
相较于异步调度,DevEco Profiler当前基于采样分析的Time任务更善于分析同步性能问题。如开发者需要分析异步调度延时等问题,可先在ArkTS代码中进行自定义打点,当元服务/应用在Time分析过程中触发打点后,DevEco Profiler会将这些打点的Trace数据解析后,以任务方块形式呈现在“User Trace”泳道中。
您可以在“User Trace”子泳道上长按鼠标左键并拖拽,框选要展示分析的时间段,获取该时间段内的用户打点信息。
单击User Trace泳道的“options”下拉列表,可以设置是按照Task Name维度还是Thread ID维度显示。
- Statistics页签:显示当前任务泳道在所选时间段内的打点任务统计信息,包括任务的名称、同一任务执行的次数、平均持续时长、最长持续时间和最短持续时间。通过这些统计信息,开发者可直观地了解打点任务的执行频率、持续时间偏差等,方便定位。
- User Trace页签:将所选时间段内的所有任务都一一列举出来,包括任务的名称、ID、起始/结束时间、持续时长等。
同时,您也可以单击“User Trace”子泳道中的任意一个任务块,“Details”区域将展示该任务块的详细信息。
说明
此外,用户自定义打点信息,还可以在Frame分析、Network分析任务中查看到。
4.4 能耗分析
DevEco Profiler提供Energy泳道,旨在帮助开发者了解应用能耗的构成,结合应用生命周期,识别潜在能耗问题。
鼠标悬浮在Energy泳道数据上,显示器件能耗使用情况。器件包含:CPU、Display、GPU、Location、Camera、Bluetooth、Flashlight、Audio、Wifi、Modem。框选Energy泳道数据,Details中呈现框选时间段内的详情信息。
5 基础内存分析:Allocation分析
5.1 内存分析及优化
应用在开发过程中,可能会因为API使用错误、变量未及时释放、异常频繁创建/释放内存等情况引发各种内存问题。
DevEco Profiler提供了基础的内存场景分析Allocation,您可以使用Allocation来分析应用或元服务在运行时的内存分配及使用情况,识别和定位内存泄漏、内存抖动以及内存溢出等问题,对应用或元服务的内存使用进行优化。
在设备连接完成后,可按照如下方法查看内存分析结果:
1. 请参考模块级build-profile.json5文件,增加strip字段并赋值为false。采集函数栈解析符号需要附带符号表信息,无符号表信息可能采集不到函数名称,因此请录制模板前按照下图进行配置。
2. 创建Allocation分析任务并录制相关数据,操作方法可参考性能问题定位:深度录制,或在会话区选择Open File,导入历史数据。
说明
- 在任务分析窗口,可以通过“Ctrl+鼠标滚轮”缩放时间轴,通过“Shift+鼠标滚轮”左右移动时间轴。或使用快捷键W/S放大或缩小时间轴,使用A键/D键可以左右移动时间轴。
- 将鼠标悬停在泳道任意位置,可以通过M键添加单点时间标签。
- 鼠标框选要关注的时间段,可以通过“Shift+M”添加时间段时间标签。
- 在任务分析窗口,可以通过“ctrl+, ”向前选中单点时间标签,通过“ctrl+. ”向后选中单点时间标签。
- 在任务分析窗口,可以通过“ctrl+[ ”向前选中时间段时间标签,通过“ctrl+]”向后选中时间段时间标签。
- Allocation分析支持离线符号解析能力,请参见离线符号解析。
Allocation分析任务支持在录制前单击指定要录制的泳道:
展开Memory泳道,子泳道展示的是按照内存类型将进程PSS值拆分开的各个维度的内存信息,类型包含ArkTS Heap/Native Heap/GL/Graph/Gurad/AnonPage Other/FilePage Other/Dev/Stack/.hap/.so/.ttf。默认展示其中的五个子泳道,如要显示其他子泳道,可以点击主泳道的options标签并勾选其他泳道来查看。
说明
- ArkTS Heap:ArkTS堆的内存占用。
- Native Heap:Native层(主要是应用依赖的so库的C/C++代码)使用new/malloc分配的堆内存。
- GL:应用:纹理内存,RS:纹理+图形渲染内存。
- Graph:该进程按去重规则统计的dma内存占用,包括直接通过接口申请的dma buffer和通过allocator_host申请的dma buffer。
- Gurad:保护段所占内存。
- AnonPage Other:其他有匿名页所占内存(非heap、anon:native_heap、anon:ArkTS heap开头的匿名页)。
- FilePage Other:其他没有被映射到文件的页所占内存。
- Dev:进程加载的以/dev开头的文件所占内存。
- Stack:栈内存。
- .hap:进程加载的.hap文件所占内存
- .so:进程加载的.so动态库所占内存。
- .ttf:进程加载的.tff字体文件所占内存。
- ArkTS Allocation泳道:显示方舟虚拟机上的内存分配信息。该泳道默认不展示,如需录制该泳道数据,在录制前单击左上角菜单栏图标,勾选ArkTS Allocation泳道。由于隐私安全政策,已上架应用市场的应用不支持录制此泳道。建议避免同时录制ArkTS Allocation及Native Allocation泳道,避免影响分析准确性。
- Native Allocation泳道:显示具体的Native内存分配情况,包括静态统计数据、分配栈、每层函数栈消耗的Native内存等信息。由于隐私安全政策,已上架应用市场的应用不支持录制此泳道。
说明
- 设置的最小跟踪内存数值越小、回栈深度越大,对应用造成的影响就越大,可能会导致DevEco Profiler卡顿。请根据应用实际的调测情况进行合理设置。
- 统计模式用于不关注单次分配、关注应用较长时间的内存变化情况的场景,将指定的采样间隔内的数据做合并统计,以达到降低处理数据量,提高录制效率和时长的目的。设置的Sampling Interval为近似值,即尽可能地在接近这个时间内做统计汇总,存在一定的偏差,偏差不超过1s,这个偏差不会对内存分配的正确性产生影响。
说明
- 在任务录制过程中,单击分析窗口左上角的可启动内存回收机制。
- 当方舟虚拟机的调优对象的某个程序/进程占用的部分内存空间在后续的操作中不再被该对象访问时,内存回收机制会自动将这部分空间归还给系统,降低程序错误概率,减少不必要的内存损耗。
3. 在目标泳道上长按鼠标左键并拖拽,框选要展示分析的时间段。
Details区域中显示此时间段内指定类型的内存分析统计信息:
- Memory泳道:
- 主泳道的详情区域显示当前框选时间段内各采样点的应用内存PSS总和以及各种内存页面状态的内存占用总和。
-
- 子泳道的详情区域显示该泳道所代表的内存类型的框选时间段内各采样点的PSS总和以及各种内存页面状态的实际占用情况。
注意
Graph字段统计方式为:计算/proc/process_dmabuf_info节点下该进程使用的内存大小。
- ArkTS Allocation泳道:显示被选择进程所使用的所有ArkTS内存总和,框选后展示此时段内录制到的所有方舟实例的对象分配信息。框选子泳道后显示当前框选时段内运行对象的内存使用情况,包括层级、对象自身内存大小、对象关联内存大小等。
“Details”区域中带标识的对象,表示其可以通过窗口访问。每个时段内已释放的内存大小在柱子上置灰,未释放的内存保持绿色。
- Native Allocation泳道:框选子泳道后显示具体的内存分配,包括静态统计数据、分配栈等。
- Statistics页签中显示该段时间内的静态分配情况,包括分配方式(Malloc或Mmap)、总分配内存大小、总分配次数、尚未释放的内存大小、尚未释放次数、已释放的内存大小、已释放次数。
- Call Trees页签显示线程的内存分配栈情况,包括函数地址或符号、分配大小、占比以及函数栈帧的类别等。单击任一行栈帧,“More”区域将显示经过该栈帧的分配内存最大的调用栈。
- Allocations List显示内存分配的详细信息,包括内存块起始地址、时间戳、当前活动状态、大小、调用的库、调用库的具体函数、事件类型(与Statistics页签的分配方式对应)等
说明
统计模式(Statistics Mode)下不存在Allocations List信息。
选择任一对象,右侧会展示与该对象相关的所有库和调用者
4.(可选)根据分析结果,双击可能存在问题的调用栈,跳转至相关代码。开发者可根据实际需要进行优化。
说明
Release应用暂不支持跳转到用户侧Native代码。
5.2 分析数据筛选
Allocation分析过程中提供多种数据筛选方式,方便开发者缩小分析范围,更精确地定位问题所在。
5.2.1 通过内存状态筛选
在Allocation分析过程中,对“Native Allocation”泳道的内存状态信息进行过滤,便于开发者定位内存问题。
在“Native Allocation”泳道的“Detail”区域左下方的下拉框中,可以选择过滤内存状态:
- All Allocations:详情区域展示当前框选时间段内的所有内存分配信息。
- Created & Existing:详情区域展示当前框选时间段内分配未释放的内存。
- Created & Released:详情区域展示当前框选时间段内分配已释放的内存。
5.2.2 通过统计方式筛选
在“Native Allocation”泳道的“Statistics”页签中,可以打开“Native Size”选择统计方式以过滤统计数据:
- Native Size:详情区域按照对象的原生内存进行展示。
- Native Library:详情区域按照对象的so库进行展示。
5.2.3 通过so库名筛选
在“Native Allocation”泳道的“Allocations List”页签中,可以单击“Click to choose”选择要筛选的so库以过滤出与目标so库相关的数据:
5.2.4 通过搜索筛选
在Native Allocation泳道的页签中, 根据界面提示信息输入需要搜索的项目,可定位到相关内容位置,使用搜索框的<、>按键可依次显示搜索结果的详细内容。
5.2.5 筛选内存分配堆栈
在Native Allocation泳道的Call Trees页签中,可以通过底部的“Call Trees”和“Constraints”选择框来过筛选和过滤内存分配栈。
Call Trees选择框包含两种过滤条件:
- Separate by Allocated Size:在内存分配栈完全相同的情况下,会按照每次分配栈申请的内存大小将栈分开;
- Hide System Libraries:隐藏内存分配栈中的系统堆栈。
Constraints选择框也包含了两种过滤条件:
- Count:根据指定的内存申请次数过滤内存分配栈信息;
- Bytes:根据指定的内存申请大小过滤内存分配栈信息。
在Call Trees页签的More区域,单击“Heaviest Stack”旁的隐藏按钮可以单独控制是否显示More区域最大内存分配栈中的系统堆栈。
在Call Trees页签,可以通过底部的“Flame Chart”切换到火焰图视图。
5.3 分析启动内存
应用/元服务在启动过程中对内存资源的占用情况,是开发者较为关心的问题。DevEco Profiler的Allocation分析任务,提供了启动内存分析能力,协助开发者优化启动过程的内存占用。
针对调测应用的当前运行情况,DevEco Profiler对其做如下处理:
- 如选择的是已安装但未启动的应用,在启动该分析任务时,会自动拉起应用,进行数据录制,结束录制后可正常进入解析阶段。
- 如选择的是正在运行的应用,在启动该分析任务时,会先将应用关停,再自动拉起应用,进行数据录制,结束录制后可正常进入解析阶段。
具体操作方法为:在任务列表中单击Allocation任务后的按钮。在分析结束后,呈现出的数据类型以及相应的处理方法,与非启动过程的分析相同。
6 内存泄露分析:Snapshot分析
针对方舟虚拟机,DevEco Profiler提供了内存快照分析能力,结合Memory实时占用情况,分析不同时刻的方舟虚拟机内存对象占用情况及差异。
注意
由于隐私安全政策,已上架应用市场的应用不支持使用Snapshot分析模板。
6.1 Snapshot模板基本操作
6.1.1 查看快照详情
1. 创建Snapshot场景调优分析任务,操作方法可参考性能问题定位:深度录制。
说明
- 在任务分析窗口,可以通过“Ctrl+鼠标滚轮”缩放时间轴,通过“Shift+鼠标滚轮”左右移动时间轴。或使用快捷键W/S放大或缩小时间轴,使用A键/D键可以左右移动时间轴。
- 将鼠标悬停在泳道任意位置,可以通过M键添加单点时间标签。
- 鼠标框选要关注的时间段,可以通过“Shift+M”添加时间段时间标签。
- 在任务分析窗口,可以通过“ctrl+, ”向前选中单点时间标签,通过“ctrl+. ”向后选中单点时间标签。
- 在任务分析窗口,可以通过“ctrl+[ ”向前选中时间段时间标签,通过“ctrl+]”向后选中时间段时间标签。
2. 设置Snapshot泳道。
单击任务左上角的进行泳道的新增和删除,再次单击此按钮可关闭设置并生效。
3. 开始录制后可观察Memory泳道的内存使用情况,在需要定位的时刻单击任务左上角的启动一次快照。
“ArkTS Snapshot”泳道的紫色区块表示一次快照完成。
说明
- 在任务录制过程中,单击分析窗口左上角的可启动内存回收机制。
- 当方舟虚拟机的调优对象的某个程序/进程占用的部分内存空间在后续的操作中不再被该对象访问时,内存回收机制会自动将这部分空间归还给系统,降低程序错误概率,减少不必要的内存损耗。
在“Statistics”页签中显示当前快照的详细信息:
- Constructor:构造器。
- Distance:从GC Root到这个对象的距离。
- Shallow Size:该对象的实际大小。
- Retained Size:当前对象释放时,总共可以释放的内存大小。
- Native Size:该对象所引用的Native内存大小。
- Retained Native Size:当前对象释放时,总共可以释放的Native内存大小。
- 构造函数名称后的“x数字”,表示该类型对象的数量,可单击折叠按钮展开。
- 单击列表中任一对象,右侧区域会显示从GC roots到这个对象的路径,通过这些路径可以看到该对象的句柄被谁持有,从而方便定位问题产生的原因。
- 带标识的对象,表示其可以通过全局window对象直接访问。
6.1.2 节点属性与引用链
在“Snapshot”的“Statistics”页签和“Comparison”页签中,所有实例对象节点展开后会显示"<fields>"以及"<references>",这两项节点分别代表该实例对象的属性以及该实例对象的引用链信息。
在“Snapshot”的More区域则展示“Fields”和“References”两个页签,分别代表Detail区域所选择对象的属性以及引用链信息,方便快捷查看所选中对象的属性等详细信息,而不需要跳转至对应对象。
6.1.3 节点跳转
在“Snapshot”的“Comparison”页签中,查看内存对象、对象属性及其引用链时,若要查看某一对象的详细信息,可以单击该对象所在行行尾的跳转图标跳转至该对象所在的“Statistics”页签并定位至该对象所在的位置,以查看该对象的详细信息。
6.1.4 历史节点前进/后退
当在“Comparison”和“Statistics”之间进行节点跳转后,单击详情区域左下角的左右箭头可以前进或者后退至下一个或上一个历史节点,以便快速在多个历史节点之间跳转查看。当箭头为激活状态时,表示前进/后退功能可用,当箭头为灰色状态时则代表无法使用该功能。
6.1.5 比较快照差异
在“Snapshot”的“Comparison”页签中,以当前选择的快照为base,下拉框选择的快照为Target,即可得到两次快照信息的比较结果。
在“Snapshot”的“Comparison”页签中,可进行两次快照的差异比较,比较内容包括新增数、删除数、个数增量、分配大小、释放大小、大小增量等等。通过不断对比,可快速分析和定位内存问题的具体位置。
6.1.6 Heap Snapshot离线导入
DevEco Profiler提供Heap Snapshot离线导入能力,可导入一个或多个.heapsnapshot文件。
您可以在DevEco Profiler主界面的“Create Session”区域中,单击“Open File”,导入.heapsnapshot文件。
说明
- 导入的单个文件大小不超过150M。
- 批量导入的文件数量不超过10个。
可以导入与heapsnapshot文件匹配的.jsleaklist文件,展示jsleakwatcher监控采集到的内存泄漏对象。
说明
- 导入的单个jsleaklist文件大小不超过30M。
- 导入的jsleaklist文件通过文件中的hash值与已导入的heapsnapshot文件匹配。
- 可多次导入不同的jsleaklist文件,也可同时导入多个不同的jsleaklist文件,重复导入不会覆盖已导入的匹配上的jsleaklist文件。总的导入匹配成功的文件数量不超过导入的heapsnapshot文件。
6.2 ArkTS内存泄露分析
6.2.1 分析步骤
分析内存泄漏问题步骤如下:
- 在内存泄漏前拍摄快照;
- 触发内存泄漏操作后,再次拍摄快照;
- 对比两次快照的数据,可快速找到泄漏对象并做进一步分析;
- 当有多个对象在比较视图都存在时,可以重复多次步骤2的操作,分别和未进行操作时对比,观察是否有对象出现明显的线性变化趋势,进一步缩小泄漏对象的范围。
6.2.2 录制Snapshot模板数据
1. 连接好设备后启动应用,点击应用选择框(下图中①处)选择需要录制的应用,选择Snapshot模板(下图中②处),点击Create Session或双击Snapshot图标即可创建一个Snapshot的录制模板。
2. 创建好模板后,点击三角按钮即开始录制。
3. 待右侧泳道全部显示recording后则表明正在录制中,此时点击下图中方块按钮或者左侧暂停按钮都可结束录制。
4. 拍摄快照:开始录制后,待右侧泳道全部显示recording后点击图中①处拍摄按钮,待②处显示出紫色条块表示快照拍摄完成。
5. 录制完成后可点击下图①处按钮将录制文件导出,而点击下图②处的按钮即可导入之前录制好的导出件。
6.2.3 分析Snapshot数据
6.2.3.1 常见对象介绍
6.2.3.1.1 JSArray
目前所有JSArray展开后为数组里的各个元素:
其中_proto_:原型对象,所有数组的_proto_应该是一致的;length:内置属性访问器,可以访问数组长度。
TaggedDict
位于(array)标签中,一般为虚拟机内部创建的字典,ArkTS代码层面不可见。
TaggedArray
位于(array)标签中,一般为虚拟机内部创建的数组,ArkTS代码层面不可见。
COWArray
位于(array)标签中,一般为虚拟机内部创建的数组,ArkTS代码层面不可见。
JSObject
JSObject展开后为内部的各个属性如下:
以下通过具体代码来介绍下实例化对象、声明对象、构造函数间的关系:
class People {old: numbername: stringconstructor(old: number, name: string) {this.old = old;this.name = name;}printOld() {console.log("old = ", this.old);}printName() {console.log("name = ", this.name);}
};
let p = new People(20, "Tom");
采集到的snapshot数据如下:
92729对象对应的是People,其主要声明了对象的属性和方法。
实例化对象的_proto_属性指向声明时的对象,声明对象里则会有constructor构造函数。当实例化多个对象时,实例化对象会有多个,但是声明对象和构造函数只有一个。
6.2.3.1.2 JSFunction
目前所有JSFunction都在(closure)标签中,展开即可看到所有JSFunction:
每个函数展开后为函数内的各个属性:
其中HomeObject表示父类对象,即该方法属于哪个对象;_proto_表示原型对象;LexicalEnv表示该函数的闭包上下文;name是内置属性访问器,可获取函数名;FunctionExtraInfo表示额外信息,比如一些napi接口会在这里记录函数地址;ProtoOrHClass表示原型或者隐藏类。
如果函数显示为anonymous(),则表示为匿名函数;如果函数显示为JSFunction(),则表示该函数可能为框架层函数,创建函数的时候未设置函数名。对于这两种函数名不可见的情况,可以通过查看其引用来间接确认其名称:
6.2.3.1.3 ArkInternalConstantPool
虚拟机创建的常量池,ArkTS代码层面不可见,涉及到的字符串常量会在(array)标签中展示:
6.2.3.1.4 LexicalEnv
闭包变量上下文;闭包是一个链状结构,如下所示:
733这个节点本身是一个闭包数组,其中0号元素是调用者(或者再往上的调用者,以此类推)的闭包;1号元素存储的是调试信息;2号及以后的元素存储的就是闭包传递的变量,上例传递了一个变量。
6.2.3.1.5 InternalAccessor
内置属性访问器,会有getter和setter方法,通过getter、setter可以获取、设置该属性。
6.2.3.2 分析方法
6.2.3.2.1 查看对象名称
对于声明对象,可以通过constructor属性来确定对象名称。
对于实例化对象,一般没有constructor,则需要展开_proto_属性后查找constructor;
若对象里有一些标志性属性,可以通过在代码里搜索属性名称来找到具体是哪个对象。
如果对象间有继承关系,则可以继续展开_proto_:
如上图则表明Man对象继承自People对象。
7 CPU活动分析:CPU分析
开发者可使用DevEco Profiler的CPU场景调优分析,在应用或元服务运行时,实时显示CPU使用率和线程的运行状态,了解指定时间段内的CPU资源消耗情况,查看系统的关键打点(例如图形系统打点、应用服务框架打点等),进行更具针对性的优化。
7.1 查看各CPU使用情况
- 创建CPU分析任务并录制相关数据,操作方法可参考性能问题定位:深度录制,或在会话区选择Open File,导入历史数据。
CPU分析任务支持在录制前单击指定要录制的泳道。
- “CPU Core”泳道显示当前选择调优应用或元服务的CPU的使用率。
可在“CPU Core”右侧的下拉列表中选择显示内容:
框选主泳道,可对所选时间段内的CPU使用情况进行汇总统计,可查询多时间片的进程维度统计信息、线程维度状态统计信息、线程状态统计信息,以及所有时间片的数据统计信息。
- Slice and Frequency:每个子泳道包含时间片和频率两部分,时间片显示占用该CPU核心的进程、线程。
- Usage and Frequency:每个子泳道包含CPU核心使用率和频率两部分。
3.将其展开,子泳道显示各CPU核心调度信息、各CPU核心频率信息以及各CPU核心使用率信息。
说明
将鼠标悬浮在某时间片上时,能够置灰非同进程时间片,通过此方法可以确定时间片的关联性。
4. 指定时间片,查看统计信息。
- 单击某个运行状态的时间片,可查询这个时间片的基本运行信息及调度时延信息。
- 框选多个时间片,则可查询多时间片的进程维度统计信息以及所有时间片的数据统计信息。
- 开启"View Integrated Scheduling Chain"后,点击CPU时间片泳道的节点可以查看某一个CPU运行线程的完整唤醒调度链。
说明
- 在任务分析窗口,可以通过“Ctrl+鼠标滚轮”缩放时间轴,通过“Shift+鼠标滚轮”左右移动时间轴。或使用快捷键W/S放大或缩小时间轴,使用A键/D键可以左右移动时间轴。
- 将鼠标悬停在泳道任意位置,可以通过M键添加单点时间标签。
- 鼠标框选要关注的时间段,可以通过“Shift+M”添加时间段时间标签。
- 在任务分析窗口,可以通过“ctrl+, ”向前选中单点时间标签,通过“ctrl+. ”向后选中单点时间标签。
- 在任务分析窗口,可以通过“ctrl+[ ”向前选中时间段时间标签,通过“ctrl+]”向后选中时间段时间标签。
- CPU分析支持能耗分析,请参见能耗分析。
7.2 查询进程详情
进程泳道显示进程对各CPU核心的占用情况。展开进程泳道,显示进程下的线程列表以及线程的运行状态。
- 单击运行状态的时间片,显示线程在该片段的运行详情,包括起始时间、持续时长、运行状态、所属进程,支持跳转到上个或者下个线程运行状态,支持跳转到唤醒线程状态等。
- 框选Thread泳道中多个运行状态的时间片,可查看此时间段内的不同运行状态的线程的统计信息,包括总耗时时长、最大耗时、最小耗时、平均耗时、处于当前状态的线程数量以及线程中的中载重载数据统计。
说明
中载重载数据每100ms做一次统计,24ms < Running时长 ≤ 48ms 记为中载,Running时长大于48ms记为重载。
- 框选应用进程Process主泳道,可查看此时间段内该进程下的线程并行度统计信息。并行度数据每100ms做一次统计,可以查看100ms内运行的总线程数量、各线程数并行的总时间和并行度。点选某一行,可以查看对应线程编号和运行时间段。
说明
并行度(Parallelism)取值范围是[1, cpu核数],数值越小代表并行度越低。
7.3 查看Trace详情
当存在Trace任务时,可在对应的线程泳道查看到当前线程已触发的Trace任务层叠图。选择待查询的Trace。
- 点选泳道中的Trace片段,可查看单个Trace详情,包括名称、起始时间、持续时长、深度等。
说明
- 如果用户对线程进行了自定义打点,在此处亦可查看到对应的User Trace打点信息。
- 从所在线程名称可分辨当前Trace的类型,系统Trace对应的线程名称为“线程名+线程号”,User Trace对应的线程名称为“打点任务名”。
- 框选多个Trace片段,可查看到Trace统计信息列表,包括Trace名称、此类Trace的总耗时、单个Trace的平均耗时、以及该时间段内该类Trace的触发次数等。
7.4 全局搜索指定CPU数据
DevEco Profiler为CPU分析数据提供了全局搜索能力。可选择的搜索类型如下:
- 首层搜索类型为“ALL”时,可输入任何字符串进行搜索。
- 首层搜索类型为“Unit”时,可输入任何子泳道进行搜索。
- 首层搜索类型为“CPU Core”时,可结合二层搜索类型(进程名、进程ID、线程名、线程ID),输入对应的目标进行搜索。
- 首层搜索类型为“Process”时,可输入任务名称进行搜索。
使用搜索框的<、>按键可依次显示返回结果的详细内容。
8 卡顿丢帧分析
8.1 Frame分析
开发应用或元服务过程中,如果发现有表单滑动不顺畅、页面交互延迟、动效不流畅等卡顿现象时,可以使用DevEco Profiler提供的Frame场景分析能力,录制卡顿过程中的关键数据进行分析,从而识别出导致卡顿丢帧的原因所在。此外,Frame任务窗口还集成了Time、CPU场景分析任务的功能,方便开发者在分析丢帧数据时同步对比同一时段的其他资源占用情况。
说明
- 在任务分析窗口,可以通过“Ctrl+鼠标滚轮”缩放时间轴,通过“Shift+鼠标滚轮”左右移动时间轴。或使用快捷键W/S放大或缩小时间轴,使用A键/D键可以左右移动时间轴。
- 将鼠标悬停在泳道任意位置,可以通过M键添加单点时间标签。
- 鼠标框选要关注的时间段,可以通过“Shift+M”添加时间段时间标签。
- 在任务分析窗口,可以通过“ctrl+, ”向前选中单点时间标签,通过“ctrl+. ”向后选中单点时间标签。
- 在任务分析窗口,可以通过“ctrl+[ ”向前选中时间段时间标签,通过“ctrl+]”向后选中时间段时间标签。
- Frame分析支持离线符号解析能力,请参见离线符号解析。
- Frame分析支持能耗分析,请参见能耗分析。
8.1.1 查看GPU使用情况
- 创建Frame分析任务并录制相关数据,操作方法可参考性能问题定位:深度录制,或在会话区选择Open File,导入历史数据。
- “Frame”泳道显示当前设备的GPU的使用率,将其展开,子泳道显示Render Service侧帧数据和App侧帧数据。
说明
- 一帧的绘制,一般需要由App侧提交渲染到Render Service侧,然后Render Service侧再提交给硬件进行合成渲染,因此App侧的帧和Render Service侧的帧存在关联的情况。并且可能多个APP侧的帧/同一APP侧的多个帧提交到同一个Render Service侧帧上,出现帧之间的一对多的关联情况。
- 一帧绘制的期望耗时,与fps的大小有关,一般情况下fps为60,对应的Vsync周期为16.6ms,即App侧/Render Service侧的帧耗时,一般需要在16.6ms以内。App侧帧/Render Service侧帧判断卡顿的标准为帧的实际结束时间晚于帧的期望结束时间。
- 在“RS Frame”和“App Frame”标签的泳道中,正常完成渲染的帧显示为绿色,出现卡顿的帧显示为红色。
- 除“RS Frame”和“App Frame”泳道外的“ArkTS Callstack”、“Callstack”、“CPU Core”等泳道信息,请参考基础耗时分析:Time分析、CPU活动分析:CPU分析。
8.1.2 查看指定时间段内所有进程的Frame数据统计信息
1. 在时间轴上拖拽鼠标选定要查看的时间段。
2. 框选Frame主泳道。
窗口下方的“Statistics”区域中会以进程为维度对选定时间段内的Frame信息进行统计,包括卡顿率、卡顿次数、最大连续卡顿次数、最大卡顿耗时、平均卡顿耗时以及平均正常耗时等。
3. 点击“Statistics”列表中任一进程的跳转按钮,在“FrameList”区域将展现该进程对应的Frame列表。体现各帧的起始时间、总耗时、GPU耗时以及卡顿丢帧类型。
4. 单击“FrameList”列表中任意一帧,右侧的“More”区域会中显示该帧更多关键信息。在获取该帧的预期起始时间、预期持续时间之外,您可以单击跳转至关联的切片。
8.1.3 查看指定时间段内指定进程的Frame数据统计信息
1. 在时间轴上拖拽鼠标选定要查看的时间段。
2. 选择要观察的子泳道(例如带“RS Frame”标签的泳道)。
窗口下方的“Details”区域中会显示选定时间段内的RS帧统计信息列表,体现各帧的起始时间、总耗时、GPU耗时以及卡顿丢帧类型。
3. 单击列表中任意一帧,右侧的“More”区域会中显示该帧更多关键信息。在获取该帧的预期起始时间、预期持续时间之外,您可以单击跳转至关联的切片。
8.1.4 查看指定Frame信息
在子泳道(例如带“APP Frame”标签的泳道)中选中要查看的Frame,该泳道上方是耗时最长的非UI函数,下方是UI主线程泳道。
窗口下方的“Frame”区域中会显示选定帧的关键信息,如VSync编号、开始时间、App应用侧持续时间、App应用侧业务逻辑耗时、Render Service侧持续时间、GPU持续时间、总持续时间、卡顿丢帧类型以及可能出现卡顿的原因等。”Non UI”区域中会显示非UI耗时最大的函数,如开始时间、结束时间、持续时间,函数名等。
说明
- 在选定观察对象后,DevEco Profiler会自动关联与其相关的切片,用箭头连接。
- 如果该帧是由于超出期望结束时间引起的,则显示两条线,对应期望开始时间(Expected Start)和期望结束时间(Expected End),用于关联分析同一时刻Trace或者函数采样信息。
- 将鼠标悬浮在任意帧上,会冒泡显示该帧的Jank信息。
- 卡顿丢帧类型(Jank Type):No Jank(不卡顿)、AppDeadlineMissed(App侧的卡顿)、RenderDeadlineMissed(Render Service侧的卡顿)。
8.1.5 支持动效场景调优
开发者在开发应用时,会使用到动效,动效的卡顿影响到用户的使用体验。DevEco Profiler提供动效场景的调优,能帮助开发者优化动效场景。
鼠标放置在某个动效上,显示该动效的详细信息,包括响应时延、动效持续时间、完成时延、期望帧率、FPS。
说明
- 响应时延:<=85ms 绿色,85ms~150ms 浅绿色,150ms ~250ms 浅红色,>250ms深红色。
- 期望帧率:当前系统运行满帧帧率,如60HZ、90HZ、120HZ。智能刷新率模式下,不展示期望帧率。
- 动效持续时间:根据帧率展示颜色,FPS大于达标帧率即为为绿色,小于则为深红色。智能刷新率模式下,帧率可变,颜色为灰色。达标帧率与期望帧率的大小有关,一般情况下期望帧率为60HZ,则达标帧率= 60HZ * 91.7%。
- 完成时延:响应时延和动效持续时间只要有一个为深红色,完成时延为深红色。
- Launch模板中Frame泳道点击detail区第一条动效详情信息,more区域展示动效帧Animation Data List信息。
8.1.6 查看组件帧率信息
Frame泳道下新增两类子泳道,分别为Display Vsync与DisplaySync_cb(tid),用于对可变帧率的检测调优。
- Display Vsync:该泳道显示对应时间段的屏幕刷新率,支持对框选的时间段内的vsync进行分布统计。区分”<=30HZ”、”30~60HZ”、”60~90HZ”、”>90HZ”。统计值包括框选时间段内各区间的分布比率、最小/最大/平均时长以及平均HZ。如果某场景满足了帧率改变的要求,当底层系统根据机制进行变帧,相应的情况会展现在对应的泳道。帮助开发者了解vsync的变化情况是否符合预期。
- DisplaySync_cb(tid):该泳道显示对应组件的帧率,如DisplaySync、XComponent两类接口组件动画对应的帧率。调测时,不同场景下由于帧率可变,系统实际表现是否符合预期,需要有实际的检测手段。尤其是由于DisplaySync的渲染均在UI主线程执行,当存在多个需要渲染的组件需要同时执行时,只能在UI主线程排队,此时任何一个组件的延迟都会对其他组件的渲染产生影响,导致UI卡顿。
如下图所示,vsync2和vsync4中,vsync周期内的组件由于渲染耗时长,导致以下两个vsync周期挤掉下一个vsync周期的渲染时间,导致掉帧的情况产生。
1. 选择Display Vsync泳道,在时间轴上拖拽鼠标选定要查看的时间段。
2. 详情区显示当前时间段的屏幕刷新率,当前帧最大持续时间、最小持续时间、平均持续时间以及该时间段内平均帧数。
3. 点选vsync泳道,可以查看当前帧的耗时和帧率。
4. 框选DisplaySync_cb泳道,可以查看应用侧对应组件的帧率,渲染时间等信息。
5. 同时如果组件有可能的掉帧情况,DisplaySync_cb泳道有方法能显示对应的掉帧的情况并标红展示。
8.1.7 查看ArkWeb帧率统计信息
Frame泳道中的App Frame泳道和RS Frame泳道在框选时新增fps标记。RS泳道新增过滤按钮,用于过滤ArkWeb数据。
1. 展开Frame泳道,框选一段数据。
2. 泳道出现fps标记,展示当前框选范围内的帧率统计信息。
3. 打开Only ArkWeb data开关,筛选过滤出包含ArkWeb帧的数据。
8.1.8 Anomaly泳道:查看解码过度耗时
如果工程中存在图片资源,并感知到解码绘制/渲染过程存在卡顿,可以通过Anomaly泳道查看主线程解码过程中是否存在解码过度耗时告警,并确认发生告警的时段。
如果应用中使用了worker, Taskpool工作线程等场景,通常会触发跨线程对象传递,并触发序列化和反序列化的操作。对于耗时超过阈值的序列化、反序列化操作,Anomaly也会给出对应的耗时告警,并给出发送这个操作的开始时间和耗时时间。
1. 在时间轴上拖拽鼠标选定出现告警的时间段。当耗时超过VSync周期的50%时,将在Anomaly泳道中出现红色告警,提示“Image decoding has exceeded 50% of the VSync time“。
2. 详情区给出录制时段内解码过度耗时的统计情况,包括类型,图片名,计数,总耗时,最小耗时、平均耗时、最大耗时,耗时标准差、 图源尺寸大小,目标尺寸大小等。
3. 对于耗时超过阈值的序列化、反序列化操作,Anomaly也会给出对应的耗时告警。其中可以通过options配置检测阈值,默认配置阈值为8ms。
4. 详情区给出录制时段内序列化、反序列化耗时情况统计信息,包括类型、计数、总耗时、最小耗时、平均耗时、最大耗时、耗时标准差等。
8.1.9 User Events泳道:查看用户事件耗时
开发者在卡顿丢帧场景可通过User Event用户事件,查看用户事件开始时间、应用开始处理时间以及应用处理耗时等情况。
1. 选择User Event泳道,在时间轴上拖拽鼠标选定要查看的时间段。
2. 详情区列表给出录制时间段内用户事件详情,包括用户事件ID、事件开始时间Input Time、应用开始处理时间Processing Start、应用处理耗时Duration和事件类型User Event Type。
3. 点选User Event泳道中的条块,Slice详情区展示该事件的详情信息。
8.2 ArkUI分析
8.2.1 场景
ArkUI分析用于定位由于组件耗时、页面布局、状态变量更新导致的卡顿问题。常见场景包含:
场景1:布局嵌套过多引起的性能问题;
场景2:数据结构设计不合理,应用使用一个较大的Object,在更新时,只更新某些属性,导致其他没变化的属性也会更新,产生冗余刷新;
场景3:父组件中的子组件重复绑定同一个状态变量进行更新;
场景4:未正确使用装饰器,如错误使用@Prop传递一个大的对象进行深度拷贝。
8.2.2 ArkUI Component 泳道:查看组件绘制耗时
开发者通过ArkUI Component泳道可以直观感知组件绘制频度、耗时等统计情况。
1. 在时间轴上拖拽鼠标选定要查看的时间段。
2. 详情区Summary列表给出录制时段内定制组件以及系统组件的绘制统计情况,包括绘制次数、总耗时、最小耗时、平均耗时、最大耗时、耗时标准差。
3. 详情区Details列表可以查看按照时间线排序的组件详情,同时more区域展示以该组件为根节点的组件树信息。
4. 点选ArkUI Component泳道中的条块,展示Slice Detail数据,Slice Detail中的Name支持跳转至对应trace泳道并选中trace信息,同时more区域展示以该组件为根节点的组件树信息。
说明
由于隐私安全政策,已上架应用市场的应用不支持录制ArkUI Component泳道。
8.2.3 ArkUI State 泳道分析
1. 点击ArkUI模板创建session并启动录制,录制过程中触发组件刷新。
2. 录制结束等待处理数据完成。点击ArkUI State泳道,可在下方数据区查看录制过程中发生的状态变量变化。Summary区域可查看状态变量名称,变化次数,状态变量类型和所属组件。
Current Value 以时间顺序展示状态变量变化,Current Values列展示变化后的值。
3. 选择Current Value中某一个数据,泳道区域将以虚线展示其时间位置。同时,右侧more区域展示该状态变量影响的组件关联关系。
4. 定位到可能造成卡顿的状态变量变化时间点,框选对应时间段,选择ArkUI Component泳道查看对应组件刷新时间。
说明
- 如需查看其他泳道信息,请参考Frame分析。
- 由于隐私安全政策,已上架应用市场的应用不支持录制ArkUI State泳道。
9 冷启动分析:Launch分析
开发应用或元服务过程中,启动速度是很重要的一个指标。如果开发者需要分析启动过程的耗时瓶颈,优化应用或元服务的冷启动速度,可使用DevEco Profiler提供的Launch场景分析能力,录制启动过程中的关键数据进行分析,从而识别出导致启动缓慢的原因所在。此外,Launch任务窗口还集成了Time、CPU、Frame场景分析任务的功能,方便开发者在分析启动耗时的过程中同步对比同一时段的其他资源占用情况。
此处仅介绍“Launch”泳道相关内容,集成的Time、CPU、Frame场景分析任务的功能请参考对应任务的章节。
说明
- 不支持命令拉起的release应用不能进行Launch分析。
- 锁屏状态下可进行Launch录制。
9.1 查看启动过程中各阶段的耗时情况
1. 创建Launch场景调优分析任务并录制相关数据,操作方法可参考性能问题定位:深度录制,或在会话区选择Open File,导入历史数据。
说明
- 在任务分析窗口,可以通过“Ctrl+鼠标滚轮”缩放时间轴,通过“Shift+鼠标滚轮”左右移动时间轴。或使用快捷键W/S放大或缩小时间轴,使用A键/D键可以左右移动时间轴。
- 将鼠标悬停在泳道任意位置,可以通过M键添加单点时间标签。
- 鼠标框选要关注的时间段,可以通过“Shift+M”添加时间段时间标签。
- 在任务分析窗口,可以通过“ctrl+, ”向前选中单点时间标签,通过“ctrl+. ”向后选中单点时间标签。
- 在任务分析窗口,可以通过“ctrl+[ ”向前选中时间段时间标签,通过“ctrl+]”向后选中时间段时间标签。
- Launch分析支持离线符号解析能力,请参见离线符号解析。
- Launch分析支持动效场景调优,请参见支持动效场景调优。
Launch分析任务支持在录制前单击指定要录制的泳道。
针对调测应用的当前运行情况,DevEco Profiler对其做如下处理:
- 如选择的是已安装但未启动的应用,在启动该分析任务时,会自动拉起应用,进行数据录制,结束录制后可正常进入解析阶段。
- 如选择的是正在运行的应用,在启动该分析任务时,会先将应用关停,再自动拉起应用,进行数据录制,结束录制后可正常进入解析阶段。
“Launch”泳道显示启动生命周期各阶段的耗时分布情况。
2. 单击“Launch”泳道上的单个阶段,或框选多个阶段,在下方的“Details”区域中,可查看到所选阶段的耗时统计情况。
展开各阶段的统计信息折叠表,可以看到各个任务的具体耗时信息。单击跳转按钮,可直接跳转至相关线程打点任务中。
9.2 分析静态资源库加载耗时
1. 展开“Launch”泳道,其中的“Static Initialization”子泳道展示启动过程中各静态资源库的加载耗时。
2. 单击单个静态资源库色块,或框选多个静态资源库,下方的“Details”区域展示所选对象的耗时统计信息。
针对耗时超过预期的加载任务,可单击跳转按钮,跳转至相关线程打点任务中进行深度分析。
9.3 查看核心线程在CPU Core的运行情况
1. 展开“Launch”泳道,其中的“Running CPU Cores”子泳道展示启动过程中的关键线程具体运行在哪个CPU核心。
2 单击单个进程色块,或框选多个进程,下方的“Details”区域展示所选对象的运行情况统计信息。
单击对应CPU的跳转按钮,可进一步跳转到CPU Core泳道查看详细的调度信息。
9.4 查看启动过程相关的线程Trace数据
- 展开“Launch”泳道,除“Static Initialization”、“Running CPU Cores”外,还包含启动过程的关键线程的状态和Trace数据。
- 单击单个切片色块,或框选多个切片,可查看所选对象的详情。
- “Details”区域对所选对象进行树状统计,显示任务的名称、起始时间以及耗时信息。
- “Thread States”区域展示线程的状态统计信息。
- “Thread Usage”区域展示线程的使用情况。
- “Slice List”区域展示所选对象的切片统计信息。
- “Load Statistics”区域展示所选对象的中载重载信息。
9.5 全局搜索Launch信息
DevEco Profiler为Launch分析数据提供了全局搜索能力。根据界面提示信息输入需要搜索的项目,可获取到相关内容的定位,使用搜索框的<、>按键可依次显示返回结果的详细内容。
10 并行并发:Concurrency分析
任务池(TaskPool)是为应用程序提供一个多线程的运行环境,降低整体资源的消耗、提高系统的整体性能,且您无需关心线程实例的生命周期。您可以使用任务池API创建后台任务(Task),并对所创建的任务进行如任务执行、任务取消的操作。
DevEco Profiler提供的Concurrency场景分析能力,帮助开发者针对并行并发场景,录制并行并发关键数据,分析Task的生命周期、吞吐量、耗时等性能问题。Concurrency模板支持展示ArkTS异步接口、NAPI异步接口、FFRT并发模型相关信息,并集成ArkTS Callstack、Callstack、Process信息,支持用户从Task生命周期关联到具体调用栈信息,方便用户定位并行并发性能问题。
10.1 查看Task统计信息
1. 选择展开某个泳道,可以用options下拉框筛选不同进程。
2. 框选某段时间范围,详情区会出现该时段内,泳道对应执行状态下,并行并发任务的统计信息。
3. 点击Task Name的跳转按钮可跳转到对应的Task泳道。
10.2 查看某一个Task的所有状态
1. 选择展开某个泳道,可以用options下拉框筛选不同进程。
2. 框选某段时间范围,可以看到该Task在框选时间范围内的任务状态。
3. 点击Task Name的跳转按钮可跳转到对应线程的泳道,可查看在该Task执行时间范围内,trace文件的打点信息,反映的是线程该时段内的函数执行情况。
4. 展开Async ArkTS泳道,可单独查看ArkTS异步调用任务详情。
5. 展开Async NAPI泳道,单独查看NAPI异步调用任务详情。
10.3 查看Task的某个状态
点击Task子泳道的某个执行节点,Details详情区里会出现task在该状态下的详细信息。
11 加载丢帧:ArkWeb分析
应用开发过程中,会通过在APP中嵌入webView以提高开发效率,可能面临ArkWeb加载和丢帧等问题。DevEco Profiler提供ArkWeb分析模板,可以结合ArkWeb执行流程的关键trace点来定位问题发生的阶段。如果问题发生在渲染阶段,可以结合H:RosenWeb数据,线程运行状态以及帧渲染流程打点数据,进一步分析丢帧问题。
11.1 ArkWeb加载问题分析
1. 创建ArkWeb模板,完成一次录制,录制期间触发Web相关场景。
2. 定界web问题发生的阶段,分析Web加载问题。
根据web页面加载过程中的关键trace点,划分了五个阶段,分别是:
1) 点击事件(Click Event),
2) 组件初始化(Component Initialization),
3) 主资源下载(PrimaryResource Download),
4) 子资源下载(Sub-Resource Download),
5) 渲染输出(Render And Output)。
3. 详情区可以跳转关键trace所在泳道,进一步分析加载问题。
框选可以查看泳道的耗时阶段划分的关键trace点,并可以根据trace信息,关联到所在线程信息。
11.2 ArkWeb丢帧问题分析
1. 分析RenderService内的H:RosenWeb的trace,查看是否有buffer缓存,没有缓存的情况下即为丢帧。
2. ArkWeb子泳道聚合了Web相关线程的trace信息,通过分析Web渲染过程的关键函数的trace点,可以分析出每一帧的执行流程。聚合的Web线程信息如下:
- H:RosenWeb:用于记录准备提交给RenderService进行统一渲染的数据量。如果超过一定时间(vsync周期)为空,则表示丢帧。
- Web应用进程:UI主线程,VSync-Webview, VizCompositorTh(Viz), CompositorGpu(drdc), Chrome_InProcGpu(Gpu主线程)等。
- Web应用Render进程: 主线程,Compositor(CC)。
- Render_Service进程: Render_Service(主线程),Vsync-rs, VsyncGenerator。
12 网络诊断:Network分析
DevEco Profiler提供Network模板,帮助用户在应用运行过程中查看http协议栈网络信息,包括请求分段耗时以及请求具体内容,方便对网络问题进行调优。请求耗时按照以下五种阶段进行划分:DNS 解析、TCP链接、TLS链接、请求等待、接受响应,分别展示在各阶段的耗时,可以针对性的优化时延问题。同时,详情信息将展示每个请求中携带的信息,包含request、response侧及其携带的header、body、cookie信息,方便网络问题定位。
说明
- 当前Network模板任务仅支持对Network kit接口中request 类型接口进行录制和调优。
- 由于隐私安全政策,已上架应用市场的应用不支持录制Network分析模板。
12.1 查看网络请求各阶段耗时
1. 创建Network模板任务并录制相关数据,操作方法可参考性能问题定位:深度录制,或在会话区选择Open File,导入历史数据。
2. 录制结束等待处理数据完成。点击Network泳道,可在下方数据区查看录制过程中发生的网络请求数量变化。Summary区域可查看按照域名(Domain)维度统计展示网络请求耗时,展示信息包含Domain、线程名称、数量、平均耗时、最大耗时、DNS解析/TCP链接/TLS链接/等待响应/接受数据平均耗时、DNS解析/TCP链接/TLS链接/等待响应/接受数据最大耗时。
3. 选择任意Domain,Details区域将展示请求该Domain的所有网络请求耗时,展示信息包含请求ID、线程名称、请求url、重定向url、IP 地址、总耗时、DNS 解析耗时、TCP链接耗时、TLS链接耗时、请求等待耗时、接受响应耗时、请求类型、状态码、使用的版本。
4. 选择Details中某一区域,泳道区域将以虚线框选展示其耗时方块。同时,右侧More区域展示该请求的Request Headers、Response Headers、Response Body。
5. 定位到可能造成网络卡顿的网络请求,点选其耗时方块,可以看见该请求各阶段耗时。
参考文档:性能分析-DevEco Studio - 华为HarmonyOS开发者