性能优化—TraceView

2024-03-16 11:38
文章标签 优化 性能 traceview

本文主要是介绍性能优化—TraceView,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

两篇文章一起看,基本就懂了

https://blog.csdn.net/yinzhijiezhan/article/details/80167283

https://www.jianshu.com/p/8a24bfb4b0d6

 

一、TraceView的用处


TraceView用于分析计算性能,流入某个方法过于耗时导致UI卡顿,或者某个方法调用次数过多,或者某个方法虽然并不占用太多内存但是占用了大量的CPU资源等等。


二、获取TraceView文件的三种方式
1:方式一:通过代码获取

case R.id.bt_trace_view:Debug.startMethodTracing("custom");startTrace();Debug.stopMethodTracing();Utils.showToast(this, "成功");break;


a:在你想要检测的某段代码的开始位置调用
Debug.startMethodTracing("custom");
其中custom可根据需要自定义,其实就是生成的TraceView文件的文件名,例如custom.trace
b:在你想要检测的某段代码的结束位置调用
Debug.stopMethodTracing();
结束检测没有参数。
注意:这两行代码要在同一个线程成对出现。
c:通过以上设置运行代码后就会在手机里生成/sdcard/custom.trace文件
d:然后通过adb pull /sdcard/custom.trace D:\folder命令将custom.trace导出到指定目录。

后面会着重讲打开.trace文件且分析.trace文件的方法。


2:方式二:通过Android Studio的Monitor的CPU模块生成

a:保持app在运行状态,在你要开始检测某个功能时点击一下按钮Start Method Tracing;

b:根据需要操作一下app,再点击该按钮Stop Method Tracing,则检测区间结束,Studio会打开.trace文件的查看窗口,
    这个.trace文件在你app项目的captures目录下。
c:这个窗口界面并不友好,也不好用,我们不直接观察这个界面,所以我们像方式一一样将这个.trace文件保存到某个目录。
    这里为了和上面的方式一统一,我也把这个文件保存到D:\folder,并且重命名为custom.trace文件。
后面会着重讲打开.trace文件且分析.trace文件的方法。


3:通过Tools --> Android --> Android Device Monitor获取


a:通过Tools --> Android --> Android Device Monitor路径进入,然后参考下图开始分析;

b:操作一会app后参考下图结束分析你刚才的操作执行的代码;

c:分析完成后会打开.trace文件如下图,这个界面的底部的搜索功能不可用,而且我们经常需要搜索功能,所以我的习惯也是
    不采用这种方式产生的.trace文件。
    
到此,三种获取.trace文件的方式讲完了,第一种方式和第二种方式我们都获取到了.trace文件,第三种方式我一般不采用。


三:分析trace文件


前面讲到的方式一方式二我们获取到了.trace,下面讲解如果打开并分析该.trace文件
要打开.trace文件就用到了sdk目录下的D:\sdk\tools\traceview.bat工具,通过如下命令就打开.trace文件并进入分析界面


由于通常我们的业务代码比较复杂,产生的.trace文件也很复杂不方便我们学习,所以这里我自己写一段非常简单的代码并通过前面方式一讲到的通过代码的方式获取.trace文件来讲解。

private void test() {Debug.startMethodTracing("custom");startTrace();Debug.stopMethodTracing();Utils.showToast(this, "成功");
}/*** jie1()和jie2()没有调用关系是兄弟关系*/
private void startTrace() {jie1();jie2();
}/*** jie2()中两次调用jie3(),其中jie3(0)直接return,不产生递归也不会调用jie4()* jie3(3)会先调用一次jie4()再产生3次递归调用*/
private void jie2() {jie3(0);jie3(3);
}private void jie3(int count) {if (count == 3) {jie4();}if (count == 0) {return;} else {jie3(count - 1);}
}/*** 故意做比较耗时的操作:用于区分Excl和Incl的关系*/
private void jie4() {for (int i = 0; i < 15; i++) {for (int j = 0; j < 15; j++) {int k = i + j;}}
}private void jie1() {}


这段代码对应的.trace文件如下图

其中各个字段的说明:

Incl Cpu Time%
Incl Cpu Time
某函数占用的CPU时间,包含内部调用其它函数的CPU时间

Excl Cpu Time% 
Excl Cpu Time
某函数占用的CPU时间,但不含内部调用其它函数所占用的CPU时间
结论:父方法的Incl Cpu Time = 父方法的Excl Cpu Time + 子方法的Incl Cpu Time....  省略号说明一个方法可以调用多个方法

Incl Real Time%
Incl Real Time
某函数运行的真实时间(以毫秒为单位),内含调用其它函数所占用的真实时间

Excl Real Time%
Excl Real Time
某函数运行的真实时间(以毫秒为单位),不含调用其它函数所占用的真实时间
结论:父方法的Incl Real Time = 父方法的Excl Real Time + 子方法的Incl Real Time....省略号说明一个方法可以调用多个方法

Call+Recur Calls/Total
没展开某个方法时:
会显示该方法被程序员主动调用次数,以及被自身递归调用次数;例如:2+3,程序员调用两次,自己递归调用3次
展开某个方法时:
父方法会显示:其调用(程序员主动调用,非递归)该方法的次数/该方法的总次数,例如:2/5,说明该方法总共被调用5次其中父方法主动调了他2次
子方法会显示:子方法被其调用(程序员主动调用)的次数/子方法被调用的总次数,例如1/5
注意:这里的程序员主动调用是指,你看到的代码调用了几次就是几次,并不包括代码运行中的递归
例如funcA(){
funcD();
funcB();
funcB();
}
这里程序员主动调用了两次funcB()一次funcD(),并没有管funcB()有没有递归的情况。
再例如funcB(){
funcB();
funcB();
}
这里funcB()产生了递归,但是程序员在funcB()中只主动调用了2次funcB();不管funcB()递归了多少次。

Cpu Time/Call
某函数的Incl Cpu Time与调用次数的比。相当于该函数平均执行时间,注意不是Excl Cpu Time;

Real Time/Call
某函数的Incl Real Time与调用次数的比。相当于该函数平均执行时间,注意不是Excl Real Time;

注意:这些列可以左右拖动调换位置


通过对TraceView文件的分析,如果发现某个方法运行时间明显过长或者调用次数异常过多,则就存在优化的可能


 

这篇关于性能优化—TraceView的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/815375

相关文章

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

MySQL高性能优化规范

前言:      笔者最近上班途中突然想丰富下自己的数据库优化技能。于是在查阅了多篇文章后,总结出了这篇! 数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名识意,并且最后不要超过32个字符 临时库表必须以tmp_为前缀并以日期为后缀,备份

黑神话,XSKY 星飞全闪单卷性能突破310万

当下,云计算仍然是企业主要的基础架构,随着关键业务的逐步虚拟化和云化,对于块存储的性能要求也日益提高。企业对于低延迟、高稳定性的存储解决方案的需求日益迫切。为了满足这些日益增长的 IO 密集型应用场景,众多云服务提供商正在不断推陈出新,推出具有更低时延和更高 IOPS 性能的云硬盘产品。 8 月 22 日 2024 DTCC 大会上(第十五届中国数据库技术大会),XSKY星辰天合正式公布了基于星

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

PR曲线——一个更敏感的性能评估工具

在不均衡数据集的情况下,精确率-召回率(Precision-Recall, PR)曲线是一种非常有用的工具,因为它提供了比传统的ROC曲线更准确的性能评估。以下是PR曲线在不均衡数据情况下的一些作用: 关注少数类:在不均衡数据集中,少数类的样本数量远少于多数类。PR曲线通过关注少数类(通常是正类)的性能来弥补这一点,因为它直接评估模型在识别正类方面的能力。 精确率与召回率的平衡:精确率(Pr