实战技巧 DevEco Profiler 性能调优 Time

embedded/2024/12/21 11:38:49/

实战技巧 DevEco Profiler 性能调优 Time

背景

DevEco Studio 开发工具中提供了 Profiler 面板,可以让我们在针对实际开发应用过程中碰到的一些性能相关的问题提供解决方案。如响应速度慢、动画卡顿、内存泄漏、发热、耗电快等等场景。其中 Profiler 提供了实时监控、深度录制等监控过程的功能。从分析的角度入手,主要有以下几个纬度进行分析:

场景面板
基础耗时分析Time
基础内存分析Allocation
内存泄露分析Snapshot
CPU 活动分析CPU
冷启动分析Launch
并行并发分析Concurrency
加载丢帧分析ArkWeb
网络诊断Network

在这里插入图片描述

不过需要注意的是 Profiler 只能配合真机来使用,模拟器暂时不支持。

Time

Time 面板常见的需求是对应用中的函数耗时进行分析。函数作为应用开发基本的基石,一般常见的耗时工作都是放在函数中进行的。

Time 可以对同步函数和异步函数进行分析。还提供了很方便的一键跳转到源码的功能,给开发者调试代码提供了很高效率的保证。

调试素材

为了方便调试,我们提供了以下素材。

image-20241119235346173

typescript">import { promptAction } from '@kit.ArkUI'@Entry
@Component
struct Index {fn1() {this.fn2()}fn2() {this.fn3()}fn3() {this.fn4()}fn4() {promptAction.showToast({ message: `快速任务结束` })}build() {Column() {Button("快速任务").onClick(() => {this.fn1()})}.width("100%").height("100%").justifyContent(FlexAlign.Center)}
}

设置函数名称

在模块的 build-profile.json5 中添加以下配置,否则采集到的函数可能都是匿名函数

entry/build-profile.json5 中 设置 strip 为 false

{"apiType": "stageMode","buildOption": {"nativeLib": {"debugSymbol": {"strip": false}}},

选择应用和进程

点击菜单中的 Profiler,然后选择对应的设备和应用,进程会自动选中的。

image-20241119235643530

然后选中 Time 菜单

image-20241119235903928

开始跟踪,定位耗时任务

  1. 一切准备就绪后,点击创建 Session

  2. 然后点击 按钮开始录制

    image-20241120000051504

  3. 在录制过程中,开始使用你的应用来重现问题。操作完毕后,记得点击结束。完成这次流程的录制。

    在这里插入图片描述

Time 面板介绍

在点击结束录制后,便能看到这个画面

image-20241120001739740

ArkTS Callstack

方舟运行时函数调用泳道,基于时间轴展示 CPU 使用率和虚拟机的执行状态,以及当前调用栈名称和调用类型。由于隐私安全政策,已上架应用市场的应用不支持录制此泳道。

调用栈分类从语言层面分为 ArkTS、NAPI 以及 Native,从归属层面分为开发者代码以及系统代码。从这两个方面可以将调用栈类型归类如下:

  • ArkTS:程序正在执行 ArkTS 代码;

  • NAPI:程序正在运行的 NAPI 代码;

  • Native:程序正在执行的 Native 代码;

    其中每一个类型的亮色灰色分别代表开发者和系统的代码。

image-20241120001849449

  1. ArkTs Callstack 包含有开发者自己写的代码。点击它,会在下方显示详情面板

  2. Weight 表示函数的总耗时,Self 表示函数自身的耗时。如

    image-20241120002136473

  3. Heaviest Stack 表示是Details区域选择节点所处的耗时最长的完整调用栈

  4. 绿色部分表示开发者自己编写的代码,可以看见右侧还有对应的 fn1、fn2、fn3 等等。通过这个函数调用栈便可获知哪个函数比较行耗时了

  5. 此时,如果想要快速定位到源码,双击函数即可

    PixPin_2024-11-20_00-24-52

User Trace

Time 面板一般直接用来分析同步代码,如果想要分析和定位异步代码,建议搭配 hiTraceMeter 接口配套 User Trace 使用

hiTraceMeter 接口

接口名描述
hiTraceMeter.startTrace(name: string, taskId: number)异步时间片跟踪接口,标记一个预跟踪耗时任务的开始。taskId 是 trace 中用来表示关联的 ID,如果有多个 name 相同的任务并行执行,则每次调用 startTrace 的 taskId 不同;如果具有相同 name 的任务是串行执行的,则 taskId 可以相同。
hiTraceMeter.finishTrace(name: string, taskId: number)异步时间片跟踪接口,name 和 taskId 必须与流程开始的 hiTraceMeter.startTrace 对应参数值保持一致。

调试素材

typescript">import { hiTraceMeter } from '@kit.PerformanceAnalysisKit'@Entry
@Component
struct Index {sleep(n: number) {const promise = new Promise<void>(resolve => {setTimeout(() => {resolve()}, n * 1000)})return promise}async asyncCb1() {hiTraceMeter.startTrace("异步长时任务", 1)await this.sleep(1)hiTraceMeter.finishTrace("异步长时任务", 1)await this.asyncCb2()}async asyncCb2() {hiTraceMeter.startTrace("异步长时任务", 2)await this.sleep(2)hiTraceMeter.finishTrace("异步长时任务", 2)await this.asyncCb3()}async asyncCb3() {hiTraceMeter.startTrace("异步长时任务", 3)await this.sleep(3)hiTraceMeter.finishTrace("异步长时任务", 3)}build() {Column() {Button("异步长时任务").onClick(async () => {await this.asyncCb1()AlertDialog.show({ message: JSON.stringify('结束', null, 2) })})}.width("100%").height("100%").justifyContent(FlexAlign.Center)}
}

在这里插入图片描述

分析

image-20241120003154861

  1. 展开 User Trace
  2. 可以看见 User Trace 泳道上存在粉色的 3 个异步任务
  3. 点击以上随便一个,可以在 detail 中看见这个函数的具体耗时

总结

开发应用或服务过程中,如果遇到卡顿、加载耗时等性能问题,开发者通常会关注相关函数执行的耗时情况。DevEco Profiler 提供的 Time 场景分析任务,可在应用/服务运行时,展示热点区域内基于 CPU 和进程耗时分析的调用栈情况,并提供跳转至相关代码的能力,使开发者更便捷地进行代码优化。


http://www.ppmy.cn/embedded/147516.html

相关文章

iOS在项目中设置 Dev、Staging 和 Prod 三个不同的环境

在 Objective-C 项目中设置 Dev、Staging 和 Prod 三个不同的环境&#xff0c;并为每个环境使用不同的 Bundle ID&#xff0c;可以通过以下步骤实现&#xff1a; 步骤 1: 创建不同的 Build Configuration 打开项目&#xff1a; 启动 Xcode 并打开你的项目。 选择项目文件&…

ChromeOS 131 版本更新

ChromeOS 131 版本更新 1. ChromeOS Flex 自动注册 在 ChromeOS 131 中&#xff0c;ChromeOS Flex 的自动注册功能现已允许大规模部署 ChromeOS Flex 设备。与 ChromeOS 零接触注册类似&#xff0c;自动注册将通过组织管理员创建的注册令牌嵌入到 ChromeOS Flex 镜像中。这将…

Serverless监控和调试、持续集成和持续部署

接下来,我们将探讨Serverless架构中的监控和调试,以及如何在Serverless环境中实现持续集成和持续部署(CI/CD)。 在Serverless架构中,监控和调试是确保应用健康运行的关键。以下是一些监控和调试的最佳实践: 日志聚合:使用云服务提供商的日志服务(如AWS CloudWatch、Azu…

基于 SSM 和 JAVA 的网络直播带货查询系统:JSP 驱动的设计与实现进程

第四章 系统设计 4.1 系统体系结构 网络直播带货网站的结构图4-1所示&#xff1a; 图4-1 系统结构 模块包括主界面&#xff0c;主页、个人中心、用户管理、商品分类管理、商品信息管理、系统管理、订单管理等进行相应的操作。 登录系统结构图&#xff0c;如图4-2所示&#xf…

【ETCD】ETCD 的一致性读(Linearizable Read)流程解析

ETCD中一致性读的主要流程如下所示 ETCD 的一致性读&#xff08;Linearizable Read&#xff09;流程分为以下几个步骤&#xff1a; 目录 1. 客户端发送请求2. 请求追踪和阻塞等待 Raft 响应**3. 请求 ReadIndex****4. Leader 确认自己状态****5. Leader 返回 ReadIndex****6.…

洛谷P2742 圈奶牛 (凸包 Andrew算法)

[USACO5.1] 圈奶牛Fencing the Cows /【模板】二维凸包 题目背景 upd: 新增一组 hack 数据。 题目描述 农夫约翰想要建造一个围栏用来围住他的奶牛&#xff0c;可是他资金匮乏。他建造的围栏必须包括他的奶牛喜欢吃草的所有地点。对于给出的这些地点的坐标&#xff0c;计算…

最新D音滑块JS纯算法还原(含完整源码)

文章目录 1. 写在前面2. 接口分析2. 源码实现【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python与爬虫领域研究与开发工作! 【🌟作者推荐】:对爬…

RIP协议的数据包

RIP协议的数据包 Request--请求包 Response---应答包 流程 1.设备首次启动RIP协议后&#xff0c;会向所有的直连接口发送request包&#xff0c;用来请求邻居发送路由信 息 2.其他设备收到请求包后&#xff0c;会利用response包传递路由信息 3.设备收到response包后&#…