应用性能分析工具CPU Profiler,2024年最新鸿蒙工程师的面试题

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新HarmonyOS鸿蒙全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img

img
img
htt

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注鸿蒙)
img

正文

树形图列出了所有调用栈的栈底,可以理解为时序火焰图从上往下看,看到的首先是调用链的起始函数,以及各自的Total Time时间,将树形图的所有Total Time的比例相加结果为100%。

具体到某一个函数,箭头展开,可以看到该函数调用的完整调用链,可能包含多条调用链,指代这些调用链都是从该函数调用下去的。

该图表可按照Total Time的大小排序,排在最前面的代表对应函数的Total Time耗时最长,可以作为重点进行分析。

图10 树形图(Tree)示例

函数名标签(TAG)的相关说明

各类视图中函数名可能包含(TAG)格式标签,例如func1(AOT),或者函数名仅为(TAG)格式,例如(program)。

函数名包含(TAG)标签

当前支持8类函数名标签,分别是(NAPI)、(ARKUI_ENGINE)、(BUILTIN)、(GC)、(AINT)、(CINT)、(AOT)、(RUNTIME)。可为应用开发者及系统开发者对各部分进行性能分析提供参考。后四种标签通过非命令方式采集时默认不可见,可通过命令 hdc shell param set persist.ark.properties 0x505c; hdc shell reboot 打开。

  • (NAPI) :系统NativeAPI或者开发者在DevEco Studio上自定义的NativeAPI,例如模板Native C++应用中的 testNapi.add()
  • (ARKUI_ENGINE):Native实现的ArkUI组件,例如:onClick(),此类函数暂无法提供函数名。
  • (BUILTIN):由虚拟机提供的、Native实现的JS标准库接口,例如:JSON.stringify()
  • (GC):垃圾回收阶段。
  • (AINT):TS/JS方法,该方法通过虚拟机的汇编解释器解释执行。
  • (CINT):TS/JS方法,该方法通过虚拟机的C解释器解释执行。
  • (AOT):TS/JS方法,该方法通过虚拟机的AOT(Ahead Of Time)编译器提前编译成了机器码,在满足编程规范的前提下可以获得充分编译加速,执行时间比解释执行快。
  • (RUNTIME):Native接口(NAPI, ARKUI_ENGINE, BUILTIN)调用该方法时,表示该方法调用到了虚拟机内部运行时代码。
函数名仅为(TAG)标签

该类标签代表的是一类特殊节点,并非实际函数,包含三种,分别是(root)、(program)、(idle),具体含义如下。

  • (root):根节点,是program和idle以及所有栈底的父节点,可以理解为main函数的上一层。
  • (program):代表程序执行进入纯Native代码阶段,该阶段无JS代码执行,也无JS调用Native或者Native调用JS情况,可能处于系统框架层代码执行阶段。
  • (idle):被采集线程无任务执行或处于非running态,未占用CPU。

说明:

当前尚未统计(idle)阶段,该部分时间包含在(program)阶段中。

(TAG)标签时间占比统计

cpuprofile文件以json格式打开,json开头有各个TAG的总时间字段,单位为微秒(us),其中otherTime字段代表(idle)、(root)、(program)三种TAG的总时间。可以据此计算出每种TAG标签的耗时占比,为性能分析提供参考。

图11 时间占比统计示例

数据采集方法及适用场景

各采集工具适用场景及支持情况
采集方法DevEco Studio ProfilerJavaScript Profilerhdc shell应用代码插桩
debug应用支持支持支持支持
release应用暂不支持暂不支持支持支持
采集主线程支持支持支持支持
采集Worker线程暂不支持支持支持支持
采集启动后数据支持支持支持支持
采集冷启动数据暂不支持不支持支持支持
DevEco Studio Profiler工具采集
  1. 启动应用,打开DevEco Studio并确保连接到设备(右上角显示设备SN)。
  2. 按照下图所示①-⑤的步骤打开 Profiler > Time ,选择设备及应用,创建一个新的Time Session监视器。

图12 DevEco Studio Profiler采集指引

  1. 点击开始录制按钮,箭头变成方块代表开始录制。
  2. 操作应用,复现待分析场景。
  3. 再次点击录制按钮,方框变成灰色,结束录制。
  4. 选择ArkTS Callstack泳道,框选时间范围或者直接选择函数进行分析,具体可见DevEco Studio Profiler视图
Chrome浏览器JavaScript Profiler工具采集
  1. 启动应用,可通过如下命令查看应用线程号。如果要抓Worker线程,列表中会有长线程号(长度是短线程号的两倍),每个Worker线程对应一个长线程号。

hdc shell “netstat -anp | grep PandaDebugger”

  1. 绑定线程号和端口。多个Worker线程同时采集需各自绑定不同的端口号,打开多个Chrome窗口采集。

说明:

  • 建议选择较大端口号避免冲突,这里以9006为例。
  • 每次断开连接或退出进程后需重新绑定端口号。
  • 多个Worker线程同时采集需各自绑定不同的端口号,打开多个Chrome窗口采集。

hdc fport tcp:9006 localabstract:2172PandaDebugger

图13 端口映射

  1. 在Chrome浏览器输入网址: devtools://devtools/bundled/inspector.html?ws=//127.0.0.1:9006 ,端口号与上文一致,点击回车,进入JavaScript Profiler页面。
  2. 点击左上角录制按钮,按钮变为红色开始录制。
  3. 操作应用,复现待分析场景。
  4. 再次点击录制按钮,按钮变为灰色结束录制。
  5. 点击左上角性能分析报告,右侧显示性能分析图表,可以选择图表类型,显示数据表或者火焰图,具体可见 Chrome浏览器JavaScript Profiler工具视图

图14 JavaScript Profile视图布局

hdc shell命令采集
  1. 根据场景设置对应虚拟机参数。
  • 采集冷启动数据

仅采集主线程冷启动

hdc shell param set persist.ark.properties 0x705c

仅采集Worker线程冷启动

hdc shell param set persist.ark.properties 0x1505c

同时采集主线程及Worker线程冷启动

hdc shell param set persist.ark.properties 0x1705c

  • 采集启动后任意阶段

仅采集主线程任意阶段

hdc shell param set persist.ark.properties 0x2505c

仅采集Worker线程任意阶段

hdc shell param set persist.ark.properties 0x4505c

同时采集主线程及Worker线程任意阶段

hdc shell param set persist.ark.properties 0x6505c

  1. 针对冷启动数据的采集,需设置待采集应用的包名。此处以 com.ohos.example 为例。

hdc shell param set persist.ark.arkbundlename com.ohos.example

  1. 重启设备。

hdc shell reboot

  1. 启动应用,会在拉起应用前自动开始采集数据。
  2. 操作应用,复现待分析场景。
  3. 针对启动后任意阶段数据的采集,需使用如下命令,开始采集,其中 pid 为应用进程号。

hdc shell kill -39 pid

  1. 操作应用,复现待分析场景。
  2. 停止采集数据,其中 pid 为应用进程号。

hdc shell kill -39 pid

  1. 拉取cpuprofile文件。此处以com.ohos.example为例,文件实际位置及文件名以实际应用为准。

说明:

步骤6~8可重复执行多次,会分别采集多个阶段,生成多个.cpuprofile文件。

每次采集的次数后缀会加1,初始次数为1。冷启动数据无次数后缀。

主线程:

通常非系统应用抓取后cpuprofile通常存储在/data/app/el2/100/base/<bundle_name>/files/

hdc file recv /data/app/el2/100/base/com.ohos.example/files/com.ohos.example_次数.cpuprofile ./

系统应用存储在/data/app/el2/0/base/<bundle_name>/files/

hdc file recv /data/app/el2/0/base/com.ohos.example/files/com.ohos.example_次数.cpuprofile ./

Worker线程:

通常非系统应用cpuprofile通常存储在/data/app/el2/100/base/<bundle_name>/files/

hdc file recv /data/app/el2/100/base/com.ohos.example/files/com.ohos.example_线程id_次数.cpuprofile ./

系统应用存储在/data/app/el2/0/base/<bundle_name>/files/

hdc file recv /data/app/el2/0/base/com.ohos.example/files/com.ohos.example_线程id_次数.cpuprofile ./

  1. com.ohos.example.cpuprofile 文件导入Chrome浏览器 > JavaScript Profiler进行分析,具体可见 Chrome浏览器JavaScript Profiler工具视图

图15 加载cpuprofile文件

应用代码插桩采集
  1. 在应用代码中按照如下方式插桩,并打包、安装应用。

说明:

插桩位置建议选择为不会重复执行的关键位置,例如onClick中的首行和末行;若重复执行start、stop,仅有第一次的start、stop会成功执行。

import hidebug from ‘@ohos.hidebug’;
// 参数为输出文件的文件名,无需加后缀。该参数为必要参数。
hidebug.startJsCpuProfiling(“filename”);
// code block
// …
// code block
hidebug.stopJsCpuProfiling(“filename”);

  1. 启动并操作应用,复现待分析场景,确保插桩代码行能执行到。
  2. 拉取json文件并将后缀更改为cpuprofile。此处以com.ohos.example为例,文件实际位置及文件名以实际应用为准。

通常非系统应用抓取后cpuprofile通常存储在/data/app/el2/100/base/<bundle_name>/files/

hdc file recv /data/app/el2/100/base/com.ohos.example/files/filename.json ./filename.cpuprofile

系统应用存储在/data/app/el2/0/base/<bundle_name>/files/

hdc file recv /data/app/el2/0/base/com.ohos.example/files/filename.json ./filename.cpuprofile

  1. filename.cpuprofile 文件导入Chrome浏览器 > JavaScript Profiler进行分析,具体可见 Chrome浏览器javascript-profiler工具视图

图16 加载cpuprofile文件

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05
  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05
  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05
  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注鸿蒙)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

基于ArkTS 开发:https://qr21.cn/FV7h05*

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注鸿蒙)
[外链图片转存中…(img-RLZUZZUt-1713623377077)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 11
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch 提供了一个名为 `torch.autograd.profiler` 的性能分析工具,也称为Profiler,它可以帮助开发者理解和优化其代码的执行效率。Profiler 主要用于以下几个方面: 1. **CPU/GPU时间线**:它可以记录并可视化代码在 CPU 和 GPU 上的运行时间,帮助找出瓶颈和不必要的计算。 2. **函数级分析**:通过记录每个函数的执行次数、耗时以及它们之间的依赖关系,你可以了解哪些部分的计算占用了大部分时间。 3. **内存使用**:分析内存分配和释放的过程,有助于识别潜在的内存泄漏或其他内存管理问题。 4. **事件级跟踪**:除了整体的函数调用,还可以查看特定事件(如数据加载、模型前向传播等)的详细情况。 要开始使用 Profiler,首先需要导入模块,然后在需要分析的部分添加 `with torch.autograd.profiler.profile()` 装饰器。你可以选择不同的模式(如 `record_shapes` 记录张量形状,`with_stack` 包含堆栈信息等),并配置输出文件或实时查看结果。 以下是一个简单的例子: ```python import torch # 使用Profiler with torch.autograd.profiler.record_function("my_function"): # 你的代码片段 pass # 或者使用更详细的模式 with torch.autograd.profiler.profile( activities=[torch.autograd.profiler.ProfilerActivity.CPU], profile_memory=True, ) as prof: # 运行代码 ... # 输出分析结果 prof.export_chrome_trace("/path/to/trace.json") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值