0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

OpenHarmony上使用火焰图

OpenHarmony技术社区 来源:OST开源开发者 2023-04-17 10:18 次阅读

一般来说,我们发现程序卡顿,排除其他程序问题和硬件问题,那一定是自身程序中某个位置运行时,消耗的时间过长导致。

性能问题分析方式

要找到耗时的代码段,才能有针对性的进行优化,那第一个问题就是如何找到耗时的代码段。

首先我们能想到,在程序中可能存在问题的地方,加入计算时间差的代码,然后不断缩小范围,找到最终耗时的点。

#include
uint64_tGetTimeStampUS()
{
structtimevaltv;
gettimeofday(&tv,NULL);
returntv.tv_sec*1000000+tv.tv_usec;
}
.....
voidFuncA()
{
uint64_tt1=GetTimeStampUS();
FuncB();
uint64_tt2=GetTimeStampUS();
FuncC();
uint64_tt3=GetTimeStampUS();
printf("FuncBcost:%llu,FuncCcost:%llu
",t2-t1,t3-t2);
}

这种方式最终也能解决问题,但是会有一些缺点:

①对于大型项目来说,要经过大量的【编译,执行验证,添加代码】迭代,消耗大量时间。

②排查到问题后,需要把测试代码删除,下次排查时又要重新添加代码。

③通过查看文本 log 方式分析,不直观。 下面我们看看如何使用 bytrace 来分析问题。

OpenHarmony中使用 Bytrace

①在 BUILD.gn 中添加对 bytrace 的依赖:

external_deps=[
"bytrace_standard:bytrace_core",
]

②添加头文件:

#include

③添加打点代码:

voidFuncA(){
StartTrace(BYTRACE_TAG_GRAPHIC_AGP,"funcB");
funcB();
FinishTrace(BYTRACE_TAG_GRAPHIC_AGP);
}

代码部分完成了,编译更新到开发板,然后使用下面命令来抓取 log:

hdcshellbytrace-t10-b8192graphic>~/logs/log.ftrace
参数说明: -t 10:从运行命令行开始,抓取 10 秒时间(非必要参数,默认 5 秒) -b 8192:使用 8192kb(8M) 内存来缓存数据(非必要参数,默认 2048kb) graphic:抓取 graphic 类型的 trace,对应上面代码中的 BYTRACE_TAG_GRAPHIC_AGP 最后把抓取的结果保存到 log.ftrace 这个文件中(文件后缀名非限定,txt 也行),通过文本编辑器打开查看。 到目前为止,看起来跟加入时间差代码的方式差不多,还是打点看 log,接着往下看。

优化打点

把 bytrace 的打点代码封装起来,xtrace.h:

#include
#include"bytrace.h"

classXTrace
{
public:
XTrace(std::stringfname);
~XTrace();
};

xtrace.cpp:

XTrace::XTrace(std::stringfname)
{
StartTrace(BYTRACE_TAG_ZCAMERA,fname);
}

XTrace::~XTrace()
{
FinishTrace(BYTRACE_TAG_ZCAMERA);
}

这样我们用起来就更方便了:

voidFuncB(){
XTracetrace1(__func__);
}

voidFuncA(){
{
XTracetrace1(__func__);
FuncB();
{
XTracetrace2(__func__);
FuncC();
}
}
函数开始,创建 XTrace 对象时,构造函数调用 StartTrace。函数结束或离开作用域,栈中的对象会自动释放,析构函数调用 FinishTrace。 当然这种方式也可以用于时间差打点。

可视化看 log

链接如下:

https://ui.perfetto.dev

这个网站需要科学方法访问,首次访问后有了缓存,后续就可以离线访问了。

36739296-dc25-11ed-bfe3-dac502259ad0.png

我这边把网页保存下来了,在本地开 web 服务,通过 127.0.0.1 也可以使用。 首先点击左上角 Open trace file 打开 log.ftrace,右边会显示出函数调用的火焰图,点击其中一个函数,在下方可以看到准确的执行时间。

基本操作:

键盘 w,s:时间轴缩放

键盘 a,d:左右移动

可视化看时间轴就非常直观了,横条越长,消耗时间越多。

OpenHarmony 对bytrace 的集成

我们在 OpenHarmony 使用 bytrace,除了以上的便利以外,最重要的是 OpenHarmony 的代码中已经大量使用了 bytrace。

下面是我整理的已经集成 bytrace 的模块:

368b2b9a-dc25-11ed-bfe3-dac502259ad0.png

3698e0fa-dc25-11ed-bfe3-dac502259ad0.png

对于以上模块的性能问题,我们就能直接使用对应 tag 来抓取。

其他

对于一个较大的模块代码,我们需要理解他的执行流程,函数调用关系,会比较头疼。

所以我编写了一个脚本,扫描所有的 .cpp 文件,在所有函数开头自动添加:

XTracexxx(__func__);
在可视化界面分析 log,可以清晰的看到函数执行的,不同的线程,函数的调用栈,能快速的梳理代码的执行流程。 第四点中的图,是我对 foundation/ace/ace_engine/frameworks 这个目录下 2000 个左右 cpp 文件中的函数全部添加 XTrace 后,得到的应用启动流程火焰图。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 程序
    +关注

    关注

    117

    文章

    3788

    浏览量

    81095
  • 开发板
    +关注

    关注

    25

    文章

    5067

    浏览量

    97590
  • 代码
    +关注

    关注

    30

    文章

    4791

    浏览量

    68685
  • 编辑器
    +关注

    关注

    1

    文章

    806

    浏览量

    31190
  • OpenHarmony
    +关注

    关注

    25

    文章

    3725

    浏览量

    16368

原文标题:OpenHarmony上使用火焰图

文章出处:【微信号:gh_834c4b3d87fe,微信公众号:OpenHarmony技术社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    火焰探测电路

    想要做一个灭火装置,老师要我先找一个火焰探测器的电路,然后做PCB板子,有没有探测火焰的电路
    发表于 11-04 20:20

    honeywell火焰探测器

    和工业的燃烧装置的燃料燃烧火焰的监测。IRD 红外光火焰探测器IRD 红外光火焰探测器上海就瑞机械设备有限公司 销售电话021-56467099*** (微信同号) 刘小姐,QQ24
    发表于 04-27 12:28

    基于单片机的防火报警系统_DS18B20测温+火焰传感器 相关资料下载

    摘要随着现代家庭用火、用电量的增加,家庭火灾发生的频率越来越高。防火报警器也随之被广泛应用于各种场合。本文章所研究的无线多功能防火报警系统采用STC12C5A60S2为核心控制器,利用火焰传感器
    发表于 07-01 08:23

    在stm32对于火焰模块的应用分析 精选资料推荐

    在stm32对于火焰模块的应用分析一.火焰模块接线说明:+ 供电(3.3v) G 接地(GND)AO模拟输入DO数字输出以stm32f407举例说明:AO接入:PF7DO接入:PA4(实际
    发表于 08-17 08:06

    火焰传感器的工作原理是什么

    火焰传感器的工作原理是什么?使用火焰传感器有哪些注意事项?
    发表于 10-15 06:55

    在stm32火焰模块有哪些应用呢

    什么是火焰模块?在stm32火焰模块有哪些应用呢?
    发表于 11-18 06:43

    Arduion UNO&Nano;火焰传感器模块

    说明:火焰传感器(即红外接收三极管)是一种对火焰特别敏感的传感器。其利用红外线对火焰的敏感特性,用特制的红外线接收管来检测火焰,然后将火焰
    发表于 04-25 16:38

    一种基于网络摄像机的火焰识别方法

    介绍了一种基于网络摄像机的火焰识别方法。该方法对基于MPEG4格式压缩的流媒体进行处理,将分帧出的BMP图像格式的文件送入图像处理程序,利用火焰的色度特征和频闪特征实现了
    发表于 05-25 21:51 47次下载

    用火焰喷涂塑料材料及性能

    塑料种类很多,根据塑料受热的性能,可分为热塑性塑料及热固性塑料两大类。火焰喷涂用塑料粉末一般由塑料原料加上改性材料制成,这些改性材料,包括各种填料、颜料、流平
    发表于 12-08 16:33 7次下载

    火焰传感器电路

    火焰传感器电路,用于探测火源的具体位置在哪里。
    发表于 05-20 11:47 45次下载

    隧道专用火焰探测器的技术参数

    火焰探测器广泛应用于燃气,隧道,化工,冶金,制药等行业,探测器适用于汽油、煤油、柴油、航空汽油、液压油、碳氢化合物:乙烯、聚乙烯、天 然气、民用燃气、液化石油气、甲烷、乙烷、丙烷、氢气、酒精、隧道等产生爆燃场所的火焰检测。
    发表于 03-14 15:33 1989次阅读

    火焰系列之使用火焰隐藏功能提高绘制精度

    我们可以看到,火焰显示, func程序占用了近四分之一的CPU时间。但是由于我们把 func绑定在CPU0和1执行,根据小学数学我们应该可以计算出来 func最多占用 2/32=6.25%的时间。
    的头像 发表于 06-23 10:15 2052次阅读
    <b class='flag-5'>火焰</b><b class='flag-5'>图</b>系列之使<b class='flag-5'>用火焰</b><b class='flag-5'>图</b>隐藏功能提高绘制精度

    OpenHarmony生态论坛:支付终端在OpenHarmony的安全框架

    OpenHarmony生态论坛:支付终端在OpenHarmony的安全框架
    的头像 发表于 04-25 17:29 1477次阅读
    <b class='flag-5'>OpenHarmony</b>生态论坛:支付终端在<b class='flag-5'>OpenHarmony</b><b class='flag-5'>上</b>的安全框架

    OpenHarmony生态论坛:UROVO在OpenHarmony的规划和实践

    OpenHarmony生态论坛:UROVO在OpenHarmony的规划和实践
    的头像 发表于 04-25 17:33 1361次阅读
    <b class='flag-5'>OpenHarmony</b>生态论坛:UROVO在<b class='flag-5'>OpenHarmony</b><b class='flag-5'>上</b>的规划和实践

    使用Arthas火焰工具的Java应用性能分析和优化经验

    分享作者在使用Arthas火焰工具进行Java应用性能分析和优化的经验。
    的头像 发表于 10-28 09:27 283次阅读
    使用Arthas<b class='flag-5'>火焰</b><b class='flag-5'>图</b>工具的Java应用性能分析和优化经验