全面了解CPU Profiler:解读CPU性能分析工具的核心功能与用法

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。
专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。

目录

  • 一、导读
  • 二、概览
  • 三、使用
    • 3.1 通过调用系统API
    • 3.2 通过Android Studio
      • 3.2.1 轨迹界面说明
      • 3.2.2 Android Studio 抓取 App 启动的 trace 信息
  • 四、trace文件分析
    • 4.1 使用调用图表检查跟踪数据
    • 4.2 Flame Chart
    • 4.3 Top Down
    • 4.4 Bottom Up
    • 4.5 Events
  • 五、优缺点
  • 六、推荐阅读

在这里插入图片描述

一、导读

我们继续总结学习Android基础知识,温故知新。
工欲善其事必先利其器,我们要做性能优化,首先要掌握好相关工具。

二、概览

Traceview 是一个用于分析应用程序性能的工具,用来分析函数调用过程。

CPU Profiler 是 集成在Android Studio 3.2版本之后的Android Profiler工具当中,实时记录展示 App cpu消耗,用来替代Traceview。

都可以记录应用程序在运行过程中的各个方法(函数)执行时间以及方法之间的调用关系。通过Traceview,开发者可以了解应用程序中哪些方法占用了较多的时间,从而找到性能瓶颈并进行优化。

还可以以图形方式显示方法的调用树,使开发者能够更直观地分析代码的执行流程。

常用于卡顿优化、启动优化、内存优化等。

这里我们要了解一下traceview 跟 cpu profile的区别,我们在新版的android studio中已经没有单独的traceview了,就是换成cpu profile,一样的。

开发者网站

三、使用

我们可以有两种方式来抓取相关信息。

3.1 通过调用系统API

开始:
Debug.startMethodTracingSampling(new File("ddd"), 0, 5000);
这样的话,我们就开始通过traceview来使用


结束:
Debug.stopMethodTracing();
当调用该方法后,就会生产一个文件,

当文件生成后,存放位置 sd卡/Android/data/包名/files 目录下

startMethodTracingSampling 是有几个重载的方法的,我们看下源码

 /**
  * 
  * tracePath – 文件名,或者传入具体的路径
  * bufferSize – 文件大小,默认8MB.
  * intervalUs – The amount of time between each sample in microseconds.
  */
 startMethodTracingSampling(String tracePath, int bufferSize, int intervalUs) {
    VMDebug.startMethodTracing(fixTracePath(tracePath), bufferSize, 0, true, intervalUs);
}

3.2 通过Android Studio

如下图所示,依次点击profile - cpu ,然后会跳转到 cpu界面,然后就可以进行录制了。

在这里插入图片描述
在这里插入图片描述

通过图2,我们可以看到这里有四个选项,我们分别介绍: 官网

  • Callstack Sample (Sample C/C++ Functions)
    捕获应用的原生线程的采样跟踪数据。在内部,此配置使用 simpleperf 跟踪应用的原生代码。

  • System Trace (Trace System Calls:)
    捕获非常翔实的细节,以便您检查应用与系统资源的交互情况。您可以检查线程状态的确切时间和持续时间、直观地查看所有内核的CPU瓶颈在何处,并添加需分析的自定义跟踪事件。

  • Java/Kotlin Method Trace (Trace Java Methods)

    在运行时检测应用,从而在每个方法调用开始和结束时记录一个时间戳。系统会收集并比较这些时间戳,以生成方法跟踪数据,包括时间信息和 CPU 使用率。

    请注意,与检测每个方法相关的开销会影响运行时性能,并且可能会影响分析数据;对于生命周期相对较短的方法,这一点更为明显。此外,如果应用在短时间内执行大量方法,则分析器可能很快就会超出其文件大小限制,因而不能再记录更多跟踪数据。

  • Java/Kotlin Method Sample (Sample Java Methods )
    在应用的 Java 代码执行期间,频繁捕获应用的调用堆栈。分析器会比较捕获的数据集,以推导与应用的 Java 代码执行有关的时间和资源使用信息。

    基于采样的跟踪存在一个固有的问题,那就是如果应用在捕获调用堆栈后进入一个方法并在下次捕获前退出该方法,分析器将不会记录该方法调用。如果您想要跟踪生命周期如此短的方法,应使用插桩跟踪。

111

点击record开始记录,当应用交互,然后在完成时点击 Stop。性能分析器会自动在轨迹窗格中显示其跟踪信息,如下图所示。

在这里插入图片描述

3.2.1 轨迹界面说明

我们先对上图的每个区域做一下解释:

  1. 选定范围:确定需在轨迹窗格中检查所记录时间的哪一部分。当您首次记录轨迹时,CPU 性能分析器会自动在 CPU 时间轴上选择记录的完整长度。如需仅检查已记录的时间范围中的一部分的跟踪数据,请拖动突出显示区域的边缘。

  2. “Interaction”部分:沿着时间轴显示用户互动和应用生命周期事件。

  3. “Threads”部分:沿时间轴针对每一个线程显示线程状态活动(例如运行、休眠等)和调用图表(在 System Trace 中则为轨迹事件图表)。
    使用鼠标和键盘快捷键在时间轴上导航。
    双击线程名称,或在选中线程时按 Enter 键以展开或折叠线程。
    选择某个线程即可在“Analysis”窗格中查看更多信息。 按住 Shift 或 Ctrl(Mac 上为 Command)可选择多个线程。
    选择方法调用(或 System Trace 中的轨迹事件),以在“Analysis”窗格中查看更多信息。

  4. “Analysis”窗格:就是标记 4 的那一片的整个区域,显示您选择的时间范围和线程/方法调用的跟踪数据。在此窗格中,您可以选择如何查看每个堆栈轨迹(使用“Analysis”标签页 ,下面第 5 个 ),以及如何测量执行时间(使用“Time reference”下拉菜单下面第 6 个)。

  5. “Analysis”标签页:选择如何显示跟踪数据详细信息。如需详细了解各个选项,请参阅检查跟踪数据。

  6. "Time reference"菜单:选择以下选项之一,以确定如何测量每次调用的时间信息(仅在示例/跟踪 Java 方法中受支持):

wall clock time : 程序执行时间,包括调用其他方法的时间
thread time: cpu执行时间

  1. 搜索框,可按函数、方法、类或软件包名称过滤跟踪数据。

3.2.2 Android Studio 抓取 App 启动的 trace 信息

如果我们要在应用一启动就记录CPU活动,需要单独配置一下:

  1. 依次选择 Run > Edit Configurations

在这里插入图片描述

  1. 选择 Profiling - 勾选 Start this recording on startup - 选 callstack sample(跟踪 Java 方法)- apply -ok

在这里插入图片描述

四、trace文件分析

不管通过那种方式,我们得到trace文件后,直接拖到 android studio里面打开即可。
CPU 性能分析器中的轨迹视图提供了多种方法查看来自所记录的轨迹的信息。

  1. 对于方法轨迹和函数轨迹,您可以直接在 Threads 时间轴中查看 Call Chart,并从 Analysis 窗格中查看 Flame Chart、Top Down、Bottom Up 和 Events 标签页。

  2. 对于调用堆栈帧,您可以查看代码中已执行的部分及其调用原因。

  3. 对于系统轨迹,您可以直接在 Threads 时间轴中查看 Trace Events,并从 Analysis 窗格中查看 Flame Chart、Top Down、Bottom Up 和 Events 标签页。

提示:检查 Threads 时间轴时,您可以使用以下快捷方式:

  • 放大:按 W 或在按住 Ctrl 键的同时滚动鼠标滚轮(在 Mac 上,按住 Command 键)。
  • 缩小:按 S 或在按住 Ctrl 键的同时向后滚动鼠标滚轮(在 Mac 上,按住 Command 键)。
  • 向左平移:按 A 键或在按住空格键的同时向右拖动鼠标。
  • 向右平移:按 D 键或在按住空格键的同时向左拖动鼠标。
  • 展开或收起线程:双击线程名称,或在选中线程时按 Enter 键。

4.1 使用调用图表检查跟踪数据

举个例子,一个调用图表示例,展示了方法 D 的 Self 时间、Children 时间和 Total 时间。
在这里插入图片描述

4.2 Flame Chart

Flame Chart 标签页提供一个倒置的调用图表,用来汇总完全相同的调用堆栈
将具有相同调用方顺序的完全相同的方法或函数收集起来,并在火焰图中将它们表示为一个较长的横条。
这样更方便您查看哪些方法或函数消耗的时间最多。不过,这也意味着,横轴不代表时间轴,而是表示执行每个方法或函数所需的相对时间。

4.3 Top Down

用于显示方法等调用列表。

如图 所示,在 Top Down 标签页中展开方法 A 的节点会显示它的被调用方,即方法 B 和 D。在此之后,展开方法 D 的节点会显示它的被调用方,即方法 B 和 C,依此类推。

在这里插入图片描述

Top Down 标签提供一些信息来显示每个调用所花的 CPU 时间:
在这里插入图片描述

  • Self:方法或函数调用在执行自己的代码(而非被调用方的代码)上所花的时间,如图 1 中的方法 D 所示。
  • Children:方法或函数调用在执行它的被调用方(而非自己的代码)上所花的时间,如图 1 中的方法 D 所示。
  • Total:方法的 Self 时间和 Children 时间的总和。这表示应用在执行调用时所用的总时间,如图 1 中的方法 D 所示。

4.4 Bottom Up

Bottom Up 标签页用于按照占用的 CPU 时间由多到少(或由少到多)的顺序对方法或函数排序。您可以检查每个节点以确定哪些调用方在调用这些方法或函数上所花的 CPU 时间最多。

4.5 Events

“Events”表格列出了当前所选线程中的所有调用。

五、优缺点

运行时开销严重,整个代码运行都变得非常慢,因为traceview会抓取所有线程的所有函数的数据。
所有有可能带偏我们的优化方向。
比如有个方法xyz(),本身不耗时,但是加上traceview后,我们在文件里面发现它的耗时变长了,我们可能会错误的认为这个方法很耗时,然后花费精力在这个上面。

六、推荐阅读

Java 专栏

SQL 专栏

数据结构与算法

Android学习专栏

ddd

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

三、PWM呼吸灯

1. 什么是呼吸灯 如下图中的蓝色LED灯,不再是亮灭交替,而是慢慢亮慢慢灭,这就是呼吸灯 生活中常见 2. 怎样实现? 答:用PWM

【云原生】Docker-Compose全方面学习

目录 1.compose简介 Compose V2 2.compose安装与下载 二进制包 PIP 安装 bash 补全命令 卸载 3.docker compose管理命令 命令对象与格式 命令选项 命令使用说明 1.compose简介 Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可…

使用 Amazon ECS Anywhere 在边缘部署 Amazon IoT Greengrass

1.概述 亚马逊云科技提供了完备的IoT服务能力,涵盖设备服务、连接和控制服务以及云端分析服务,是快速构建安全可靠、可扩展的 IoT 平台的常见选择。Amazon IoT Greengrass 边缘运行时和云服务,可帮助您在设备上构建、部署和管理 IoT 应用。A…

VisualStudioWindows下 远程调试

前置条件 1、调试方与被调试方,以下简称调试方为A,被调试方为B。A与B双方能相互ping通 2、B需要运行RemoteDebugger服务,该程序位于C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\Remote Debugger下。 我这里是安装…

扩散模型实战(二):扩散模型的发展

推荐阅读列表: 扩散模型实战(一):基本原理介绍 扩散模型从最初的简单图像生成模型,逐步发展到替代原有的图像生成模型,直到如今开启 AI 作画的时代,发展速度可谓惊人。下面介绍一下2D图像生成相…

blender基础认识(选项开关、工具栏、视图等)

文章目录 引言一、大纲选项开关和保存启动文件1. 大纲选项1. 禁用选中2. 视图影藏3. 视图禁用4. 渲染禁用 2. 保存启动文件 二、工具栏和侧边栏1. 左侧工具栏2. 右侧工具栏 三、视图1. 视角2. 缩放3. 拖拽4. 摄像机视角5. 切换正交视图6. 局部视图7. 显示隐藏 四、添加删除物体…

2023/8/5总结

主要实现了: 举报: 内容管理搜索的实现 管理员界面 还有消息没写,以及一些小细节

插入排序【Java算法】

文章目录 1. 概念2. 思路3. 代码实现 1. 概念 通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应的位置并插入。 插入排序非常类似于整扑克牌。在开始摸牌时,左手是空的,牌面朝下放在桌上。接着&a…

程序员副业指南:怎样实现年入10w+的目标?

大家好,这里是程序员晚枫,全网同名。 今天给大家分享一个大家都感兴趣的话题:程序员可以做什么副业,年入十万? 01 推荐 程序员可以从事以下副业,以获得一年收入10w: 兼职编程:可…

数学知识(二)

一、裴蜀定理 对于任意整数a,b&#xff0c;一定存在非零整数x,y&#xff0c;使得 ax by gcd(a,b) #include<iostream> #include<algorithm>using namespace std;int exgcd(int a,int b,int &x,int &y) {if(!b){x 1,y 0;return a;}int d exgcd(b,a %…

铰接式车辆的横向动力学仿真提供车辆模型研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【Opencv入门到项目实战】(四):图像梯度计算|Sobel算子|Scharr算子|Laplacian算子

文章目录 0.引言1. Sobel算子2. Scharr算子3. Laplacian算子 0.引言 在图像处理中&#xff0c;梯度是指图像中像素灰度变化的速率或幅度&#xff0c;我们先来看下面这张图 假设我们想要计算出A点的梯度&#xff0c;我们可以发现A点位于边缘点&#xff0c;A点左边为黑色&#x…

74. 搜索二维矩阵

题目链接&#xff1a;力扣 解题思路&#xff1a;因为矩阵整体上是有序的&#xff0c;所以可以先二分查找target在哪一行中&#xff0c;然后再次二分查找target在当前行的哪一列中。 具体算法如下&#xff1a; 对行使用二分查找&#xff1a; 初始值&#xff1a; int m matrix…

Mr. Cappuccino的第55杯咖啡——Mybatis一级缓存二级缓存

Mybatis一级缓存&二级缓存 概述一级缓存特点演示前准备效果演示在同一个SqlSession中在不同的SqlSession中 源代码怎么禁止使用一级缓存一级缓存在什么情况下会被清除 二级缓存特点演示前准备效果演示在不同的SqlSession中 源代码怎么关闭二级缓存 一级缓存&#xff08;Spr…

ad+硬件每日学习十个知识点(18)23.7.29 (LDO原理、LDO的补偿引脚)

文章目录 1.LDO名字介绍2.LDO的应用范围3.LDO的原理4.LDO输出端和输入端的差值至少满足多少V&#xff1f;怎么计算的&#xff1f;5.输出的误差和输出电流&#x1f446;&#xff08;右下角图像&#xff09;6.LDO一般会有个引脚是做补偿之用&#xff0c;datasheet会说明一个器件的…

C++20 协程(coroutine)入门

文章目录 C20 协程&#xff08;coroutine&#xff09;入门什么是协程无栈协程和有栈协程有栈协程的例子例 1例 2 对称协程与非对称协程无栈协程的模型无栈协程的调度器朴素的单线程调度器让协程学会等待Python 中的异步函数可等待对象M:N 调度器——C# 中的异步函数 小结 C20 中…

如何在 Ubuntu 上部署 ONLYOFFICE 协作空间社区版?

ONLYOFFICE 协作空间是一个在线协作平台&#xff0c;帮助您更好地与客户、业务合作伙伴、承包商及第三方进行文档协作。今天我们来介绍一下&#xff0c;如何在 Ubuntu 上安装协作空间的自托管版。 ONLYOFFICE 协作空间主要功能 使用 ONLYOFFICE 协作空间&#xff0c;您可以&am…

安全文件传输的重要性及其对企业的影响

在当今的信息时代&#xff0c;企业之间的文件传输已经成为日常工作的重要组成部分。无论是在商务合作、人力资源还是财务审计等方面&#xff0c;文件传输都发挥着关键的作用。然而&#xff0c;随着网络技术的发展&#xff0c;网络安全问题也日益突出&#xff0c;泄漏、篡改、丢…