【鸿蒙(HarmonyOS)性能优化指南】启动分析工具Launch Profiler

news2025/2/26 5:33:17

Launch Profiler概述

DevEco Studio内置Profiler分析调优工具。其中Launch主要用于分析应用或服务的启动耗时,分析启动周期各阶段的耗时情况、核心线程的运行情况等,协助开发者识别启动缓慢的原因。此外,Launch任务窗口还集成了Time、CPU、Frame场景分析任务的功能,方便开发者在分析启动耗时的过程中同步对比同一时段的其他资源占用情况。

场景示例

如下代码在页面绘制之前的aboutToAppear生命周期函数内执行了耗时的计算任务,导致应用冷启动耗时长,文章后续将以本案例场景来简单介绍Frame Profiler的使用。

@Entry
@Component
struct Index {
 @State private text: string = "hello world";
 private count: number = 0;

 aboutToAppear() {
  this.computeTask();
 }

 build() {
  Column({space: 10}) {
   Text(this.text).fontSize(50)
  }
  .width('100%')
  .height('100%')
  .padding(10)
 }

 computeTask() {
  this.count = 0;
  while (this.count < 10000000) {
   this.count++;
  }
 }
}

使用约束

  • 已通过USB连接设备

  • 仅支持OpenHarmony API 10及以上版本的Stage工程

  • 不支持对命令拉起的release应用进行Launch分析,也不可对其进行Launch录制。

如何使用Launch Profiler录制数据

  1. 首先打开profiler,以DevEco Studio 4.0.0.400版本为例,可以通过如下三种方式打开Profiler:
  • 在DevEco Studio顶部菜单栏中选择“View -> Tool Windows -> Profiler”。

  • 在DevEco Studio底部工具栏中单击“Profiler”。

  • 按“Double Shift”或者“Crtl+Shift+A”打开搜索功能,搜索“Profiler”。

  1. 创建Launch任务并启动录制

① 打开Profiler性能分析器;
② 选择待分析的设备与应用进程;
③ 选择Launch工具;
④ 点击create Session按钮创建启动分析任务;
⑤ 准备好调试环境后,点击开始录制启动数据,再次点击结束录制。

说明:

  1. 针对调测应用的当前运行情况,Profiler对其做如下处理:
  • 如选择的是已安装但未启动的应用,在启动该分析任务时,会自动拉起应用,进行数据录制,结束录制后可正常进入解析阶段。

  • 如选择的是正在运行的应用,在启动该分析任务时,会先将应用关停,再自动拉起应用,进行数据录制,结束录制后可正常进入解析阶段。

  1. 在任务录制(recording)及分析(analyzing)的过程中,请不要主动断开应用或者设备,否则可能导致分析任务异常失败。
如果你对这篇鸿蒙开发的技术分析感兴趣,还请帮忙来个“素质三连”,后续带你探索 “→更多←(0区下方籽料)” 鸿蒙开发的技术奥秘!

如何使用Launch Profiler分析数据

“Launch”泳道显示启动生命周期各阶段的耗时分布情况,如下图:

① Process Creating:进程创建阶段。该阶段主要是AppSpawn fork子进程,AMS创建ability
② Application Launching:应用程序启动阶段。该阶段主要是资源加载、Application相关对象的创建与初始化、依赖模块的加载等
③ UI Ability Launching:UIAbility启动阶段。该阶段主要是资源加载、Ability相关对象的创建与初始化、依赖模块的加载等
④ UI Ability OnForeground:UIAbility置为前台阶段。该阶段主要是加载应用首页的源码和so以及创建应用首页内各个组件
⑤ First Frame - App Phase:应用侧首帧。在FlushTask中把之前加载的组件上树并布局
⑥ First Frame - Render Phase:渲染侧首帧。render_service接受下一帧应用来的首页布局信息,并绘制渲染
⑦ EntryAbility:渲染完成,首页显示

展开“Launch”泳道还包含多个与进程启动有关联的子泳道:

  • “Static Initialization”子泳道:展示启动过程中各静态资源库的加载耗时;
  • “Running CPU Cores”子泳道:展示启动过程中的主线程具体运行在哪个CPU核心;
  • “le.startup_demo”子泳道:展示启动过程的主线程的状态和Trace数据;

针对应用冷启动问题的性能分析,有以下两种方式可以选择,一种是分析主线程的Trace数据,另一种则是分析采样得到的函数热点。

分析主线程的Trace数据

从“Launch”泳道可以很明显的看出UI Ability OnForeground阶段的耗时占据应用冷启动过程的大部分时间,如下图

① 单击“Launch”泳道上的UI Ability OnForeground阶段,在下方的“Details”详情面板中,可查看到所选阶段的耗时统计情况;
② 展开UI Ability OnForeground统计信息折叠表,可以看到各函数的具体耗时信息;
③ 根据Duration找到耗时最长的函数aboutToAppear;
④ 单击 按钮,可直接跳转至主线程的打点任务中,查看相关Trace数据,如下图

可以发现aboutToAppear函数的耗时占据UI Ability OnForeground阶段的大部分时间,结合应用代码将aboutToAppear函数中的耗时计算任务以异步延迟的方式处理后,可以得到如下“Launch”泳道。

上述对比可以发现将耗时的计算任务以异步延迟的方式处理后可以显著缩短UI Ability OnForeground阶段的耗时,提升应用的冷启动速度。

分析采样得到的函数热点

我们也可以分析采样得到的函数热点直观的显示应用冷启动过程中具体函数的耗时,如下图

① 单击“Launch”泳道上的UI Ability OnForeground阶段;
② 选择“ArkTS Callstack”泳道,其会基于时间轴展示CPU使用率和状态的变化,以及当前调用栈名称和调用类型;
③ 下方“Details”详情面板中查看到这段时间内的函数热点,其会以Top-Down形式的树状列表进行展示。很明显aboutToAppear函数中的computeTask函数耗时最多,占整个阶段的81%

如果你对这篇鸿蒙开发的技术分析感兴趣,还请帮忙来个“素质三连”,后续带你探索 “→更多←(0区下方籽料)” 鸿蒙开发的技术奥秘!

此外,点击Flame Chart按钮打开火焰图可以更直观的看出热点函数的耗时情况,如下图:

根据上述步骤,使用异步延迟处理后的函数热点如下,可以发现aboutToAppear函数的执行耗时只占整个UI Ability OnForeground阶段的5.8%。

上述方法开发者可以选择自己习惯的方式去查看。一般来说,如果所选的时间段里,函数栈比较复杂的话,用火焰图找热点会更高效。当锁定到某个热点函数之后,只需要双击函数结点,Profiler工具就会为您自动打开对应的源文件,并聚焦到相应代码行。上述前提是这个源文件须是属于当前工程,并且是在DevEco Studio内完成编译的。

在使用Launch Profiler工具获取启动各阶段的耗时信息时,需要应用结合实际开发需要修改。无特殊情况下,应该避免在应用启动的生命周期函数内执行耗时操作,若需要可以使用异步延迟处理或者抛到其他线程处理。

提示

  1. Profiler为Launch分析数据提供了全局搜索能力。单击分析窗口左上角的 ,根据界面提示信息输入需要搜索的项目,可获取到相关内容的定位,使用搜索框的<、>按键可依次显示返回结果的详细内容。
  2. 在任务分析窗口,可以通过“Ctrl+鼠标滚轮”缩放时间轴,通过“Shift+鼠标滚轮”左右移动时间轴。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2265179.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微博用户消费趋势报告,多个领域增速明显,年轻一代成消费主力军

文 | 魏力 发布 | 大力财经 站在岁末回首这一年&#xff0c;在信息浪潮的汹涌翻涌之下&#xff0c;社交媒体平台犹如社会经济的晴雨表&#xff0c;精准地折射出大众生活与消费的万千景象。近日&#xff0c;大力财经看到一份报告&#xff0c;微博发布了《2024微博用户消费趋势…

智能公文写作一体机,开箱即用快速部署超便捷

在繁忙的政企事业单位中&#xff0c;时间就是生产力。公文撰写作为各类组织日常工作的核心环节&#xff0c;却常常因为传统的公文处理流程繁琐耗时而成为效率的瓶颈。如何打破这一瓶颈&#xff0c;实现高效的公文撰写&#xff0c;成为了众多单位关注的焦点。 一款即开即用的公文…

重温设计模式--中介者模式

中介者模式介绍 定义&#xff1a;中介者模式是一种行为设计模式&#xff0c;它通过引入一个中介者对象来封装一系列对象之间的交互。中介者使得各个对象之间不需要显式地相互引用&#xff0c;从而降低了它们之间的耦合度&#xff0c;并且可以更方便地对它们的交互进行管理和协调…

无人机双目视觉鲁棒定位方法!

无人机双目视觉鲁棒定位方法是一种先进的定位技术&#xff0c;它利用两个摄像头&#xff08;即双目相机&#xff09;模拟人的视觉系统&#xff0c;通过视差来确定物体的位置。这种方法在无人机定位领域具有广泛的应用前景&#xff0c;特别是在GPS信号拒止或弱纹理环境中&#x…

【R语言遥感技术】“R+遥感”的水环境综合评价方法

R语言在遥感领域中是一个强大的工具&#xff0c;它提供了一系列的功能和优势&#xff0c;使得遥感数据的分析和应用更加高效和灵活。以下是R语言在遥感中的具体应用&#xff1a; 数据处理&#xff1a;R语言可以处理和清洗遥感数据&#xff0c;包括数据转换、滤波处理、去噪和数…

vue预览和下载 pdf、ppt、word、excel文档,文件类型为链接或者base64格式或者文件流,

** 方法1&#xff1a;word、xls、ppt、pdf 这些文件&#xff0c; 如果预览的文件是链接可以直接打开&#xff0c;可用微软官方的预览地址 ** <iframe width"100%" :src"textVisibleURl " id"myFramePPT" style"border: none;backgroun…

无人设备遥控器之定向天线篇

一、定义与功能 定向天线&#xff0c;顾名思义&#xff0c;是通过改变天线的辐射方向&#xff0c;实现信号发射、接收和增强的天线。它可以让信号以更高的功率、更远的距离传输到指定区域&#xff0c;同时也能够降低与周围天线之间的干扰。在无人设备遥控器中&#xff0c;定向天…

什么是Redis缓存击穿?如何解决

1.缓存击穿介绍 Redis的缓存击穿指的是在高并发场景下&#xff0c;当一个被大量请求访问的热点key&#xff08;即非常热门的数据项&#xff09;在Redis中过期时&#xff0c;所有请求几乎同时发现缓存失效并尝试直接从后端数据库读取数据&#xff0c;这可能会导致瞬间大量的数据…

Qt父窗口处理子窗口大小变化消息installEventFilter

1.需求描述 父窗口从上到下时标题栏&#xff0c;播放窗口和工具栏&#xff0c;希望监测中间播放窗口的大小变化&#xff0c;来根据分辨率自动调整播放画面的宽高&#xff1b;因为工具栏和标题栏可以隐藏&#xff0c;所以父窗口大小不变&#xff0c;中间的播放窗口也会随着工具…

HiQA: A Hierarchical Contextual Augmentation RAG for Multi-Documents QA---附录

附录 建议的问答系统 在建议的框架中&#xff0c;问答过程是单步的。首先&#xff0c;根据查询使用 RAG 从文档库中检索相关知识。随后&#xff0c;将此上下文与问题一起输入到语言模型中以生成响应。返回答案的第一个字符所需的时间在 1 到 3 秒之间。图 5 显示了 QA 流程的…

MoGe---最新单目3D几何估计方法

目录 一、概述 二、相关工作 1、单目深度估计 2、单目几何估计 3、相机内参估计 4、单目几何的大规模数据训练 三、前置知识 1、仿射不变和尺度不变指标 2、FOV和shift 3、ROE对齐求解器 四、MoGe 1、为什么设计仿射不变&#xff1f; 2、恢复相机焦距和移位 3、…

Jenkins安全部署规范及安全基线

Jenkins安全部署规范及安全基线 进入安全设置界面启用安全Disable remember me访问控制——安全域&#xff08;Security Realm&#xff09;servlet容器代理&#xff08;Delegate to servlet container&#xff09;Jenkins专有用户数据库&#xff08;Jenkins’ own user databas…

写SQL太麻烦?免费搭建 Text2SQL 应用,智能写 SQL | OceanBase AI 实践

自OceanBase 4.3.3版本推出以来&#xff0c;向量检索的能力受到了很多客户的关注&#xff0c;也纷纷表达希望OB能拓展更多 多模数据库大模型 的AI应用实践。 在上篇文章 &#x1f449; OceanBase LLM&#xff0c;免费构建你的专属 AI 助手 &#xff0c;我们介绍了如何去搭建一…

5.npm包

文章目录 [TOC](文章目录) 3.npm与包3.1.包3.2.npm体验在项目中安装包的命令包管理配置文件一次性安装开发项目时安装的包如何从项目中卸载包devDependencies节点的作用解决下载包速度比较慢的问题nrm工具&#xff0c;利用其提供的终端命令&#xff0c;可以快速查看和切换下包的…

Dots 常用操作

游戏中有多个蚂蚁群落&#xff0c;每个蚂蚁属于一个群落&#xff0c;如何设计数据结构&#xff1f; 方法1&#xff1a;为蚂蚁组件添加一个属性 ID&#xff0c;会造成逻辑中大量分支语句&#xff0c;如果分支语句逻辑不平衡可能带来 Job 调度问题&#xff0c;每个蚂蚁会有一份蚂…

HTML与数据抓取:GET与POST方法详解

讲GET和POST就不能只讲GET和POST 你要讲HTTP请求的基本概念&#xff1a; HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;是互联网上应用最为广泛的一种网络协议&#xff0c;主要用于Web浏览器与Web服务器之间的数据通信。HTTP是一个基于…

Android 之 Activity 的启动模式(launchMode)

一、Activity 启动模式 在实际项目中&#xff0c;应该根据项目的实际需要来为每个 Activity 指定恰当的启动模式 launchMode。启动模式一共有四种&#xff0c;分别是 standard、singleTop、singleTask 和 singleInstance。可以在 AndroidManifest.xml 中通过给 <activity&g…

软考:系统架构设计师教材笔记(持续更新中)

教材中的知识点都会在。其实就是将教材中的废话删除&#xff0c;语言精练一下&#xff0c;内容比较多&#xff0c;没有标注重点 系统架构概述 定义 系统是指完成某一特定功能或一组功能所需要的组件集&#xff0c;而系统架构则是对所有组件的高层次结构表示&#xff0c;包括各…

大模型应用—IOPaint 图片去水印

IOPaint 是由 SOTA AI 模型提供支持的免费开源修复和修复工具,可以轻松实现图片去水印,去除图片不需要的部分,是目前效果最好的一个项目!完全免费开源 IOPaint 已经托管到 hugging face上,打开就可以直接免费使用,需要外网环境! 在线免费使用:【链接直达】 如果你需要…

Go C编程 第6课 无人机 --- 计算旋转角

旋转的秘密---认识角度 rt、lt命令学习 goc电子课程 一、编程步骤 第一步 第二步 第三步 第四步 二、画“四轴无人机” &#xff08;一&#xff09;、画第一根机轴 &#xff08;二&#xff09;、画第二根机轴 &#xff08;三&#xff09;、画完整的无人机 三、画“多轴无人…