您好!欢迎来到爱源码

爱源码

热门搜索: 抖音快手短视频下载   

Android性能优化:CPU分析器 {源码交易}

  • 时间:2022-10-25 01:48 编辑: 来源: 阅读:288
  • 扫一扫,手机访问
摘要:Android性能优化:CPU分析器 {源码交易}
CPU Profiler可以帮助您实时检查应用程序的CPU利用率和线程活动,并记录函数跟踪,以便您可以优化和调试应用程序代码。 为什么要分析CPU利用率?最小化应用程序的CPU占用率有很多好处,比如提供更快更流畅的客户体验,延长设备的电池寿命? 它还可以帮助应用程序在各种新旧设施中保持良好的性能。 当与应用程序交互时,您可以使用CPU Profiler来监控CPU使用情况和线程活动。 对于应用进程中的每个线程,可以查看一段时间内执行了哪些函数,以及每个函数在执行过程中消耗的CPU资源。 您还可以使用函数跟踪来标识调用者和被调用者。 调用者指的是调用其余函数的函数,被调用者指的是其余函数调用的函数。 您可以使用这些信息来确定哪些函数负责调用经常消耗大量特定资源的任务,并尝试优化应用程序代码以避免不必要的工作。 CPU Profiler概述当您打开CPU Profiler时,它会立即开始显示应用程序的CPU利用率和线程活动。 您应该会看到少量类似于图1的内容:图1如图1所示,CPU Profiler的默认视图包括以下内容:事件时间线:显示应用程序中在其生命周期中不同状态之间转换的活动,并指示客户和设施之间的交互,包括屏幕旋转事件。 CPU时间线:显示应用程序的实时CPU利用率(表示为总可用CPU时间的百分比)以及应用程序使用的线程总数。 该时间线还显示了其他进程(如系统进程或其他应用程序)的CPU使用情况,以便您可以将其与您的应用程序使用情况进行比较。 您还可以通过沿时间轴的水平轴移动鼠标来检查历史CPU使用率数据。 活动时间线:列出属于应用程序进程的每个线程,并用下面列出的颜色标记它们在时间线上的活动。 记录函数跟踪后,可以从该时间线中选择一个线程,以便在跟踪窗格中检查其数据。 绿色:表示线程处于活动状态或准备使用CPU。 也就是说,它处于“运行中”或“可运行”状态。 黄色:表示线程是活动的,但它正在等待I/O操作(如磁盘或网络I/O)才能完成工作。 灰色:表示线程正在休眠,没有消耗任何CPU时间。 当线程需要访问尚不可用的资源时,偶尔会发生这种情况。 线程进入自主睡眠,或者内核将该线程置于睡眠状态,直到所需的资源可用。 日志记录:允许您选择以下选项之一,以确定分析器如何记录函数跟踪。 Sampled:在应用程序执行期间频繁捕获应用程序调用堆栈的默认配置。 分析器比较捕获的数据集,以导出与应用代码执行相关的时间和资源使用信息。 基于“采样”进行跟踪的固有问题是,如果应用程序在捕获调用堆栈后进入函数,并在下一次捕获前退出函数,分析器将不会记录该函数调用。 如果您对这种生命周期短的跟踪函数感兴趣,您应该使用“检测”跟踪。 Instrumented:默认配置,设置应用程序在运行时记录每个函数调用开始和结束时的时间戳。 它收集时间戳并进行比较,以生成函数跟踪数据,包括时间信息和CPU使用情况。 请注意,与设置每个函数相关的开销会影响运行时性能,并可能影响分析数据,尤其是对于生命周期相对较短的函数。 此外,如果应用程序在短时间内执行大量函数,分析器可能会很快超过其文件大小限制,无法记录更多的跟踪数据。 编辑配置:允许您更改上述“采样”和“测量”记录配置的一些默认值,并将它们保存为您自己的设置配置。 有关更多信息,请转到[创建记录配置]部分 记录按钮:用于开始和停止记录功能跟踪。 有关更多信息,请参阅[记录和检查功能跟踪]部分。 和记录检查功能跟踪。要开始记录功能跟踪,从下拉菜单中选择采样或测量记录配置,或选择[设置您自己的记录配置],然后单击记录。 开始记录与应用程序交互,完成后单击停止记录。 Stop analyzer将自动选择记录的时间范围,并在function trace窗格中显示其跟踪信息,如图2所示。 如果您想检查另一个线程的函数跟踪,只需从线程活动时间线中选择它。 图二。记录功能跟踪后的CPU探查器 1选择时间范围:用于确定您要在跟踪窗格中检查记录的时间范围的哪一部分。 当您第一次记录函数跟踪时,CPU评测器会自动在CPU时间线中选择记录的完整长度。 如果您只想检查一小部分记录时间范围内的函数跟踪数据,您可以单击并拖动突出显示区域的边缘来修改其长度。 2:时间戳:用于指示记录的函数跟踪的开始和结束时间(相对于分析器开始从设施收集CPU利用率信息的时间) 在选择时间范围时,可以单击时间戳来自动选择完整的记录,这在有多条记录要切换的情况下尤其有用。 跟踪窗格:用于显示所选时间范围和线程的函数跟踪数据。 仅当您记录了至少一个函数跟踪时,此窗格才会显示。 在此窗格中,您可以选择查看每个堆栈跟踪的方式(使用trace选项卡)以及测量执行时间的方式(使用time reference下拉菜单)。 选择后,您可以以自顶向下树、自底向上树、调用图或火焰图的形式显示您的函数轨迹。 您可以在下面了解有关每个跟踪窗格选项卡的更多信息。 5从下拉菜单中选择以下选项之一,确定如何测量每个函数调用的时间信息:挂钟时间:挂钟时间信息表示实际经过的时间。 线程时间:线程时间信息表示实际运行时间减去线程不消耗CPU资源的时间。 对于任何给定的函数,其线程时间总是小于或等于其挂钟时间。 使用线程时间可以让您更好地了解给定函数消耗了多少线程的实际CPU使用率。 使用调用图标记进行检查和跟踪调用图标记提供了函数跟踪的图形表示,其中横轴表示函数调用(或调用者)的时间段和时间,纵轴显示其被调用者。 对系统API的函数调用显示为橙色,对应用程序拥有的函数的调用显示为绿色,对第三方API(包括Java语言API)的调用显示为蓝色。 下面的图3显示了一个调用图的例子,描述了给定函数的自身时间、子时间和总时间的概念。 您可以在如何使用自顶向下和自底向上检查跟踪部分中详细理解这些概念。 图3。一个调用图的例子描绘了函数d的自身、子体和总时间。 提醒:要跳转到函数的源代码,右键单击该函数并选择跳转到源代码。 这适用于任何跟踪窗格选项卡。 用火焰图标记检查痕迹。火焰图标签提供了一个倒置的调用图,它总结了相同的调用堆栈。 也就是说,收集共享相同调用方顺序的完全相同的函数,并在火焰图中用一个较长的条形表示它们(而不是像调用图中所示的那样,将它们显示为多个较短的条形) 这使您更容易看到哪些函数花费的时间最多。 然而,这也意味着横轴不再代表时间轴;相反,它表示每个函数的相对执行时间。 为了帮助说明这个概念,请考虑图4中的调用图。 注意,函数D反复调用B(B1、B2和B3),对B的少量调用也调用C(C1和C3)。 图4。多个函数调用共享同一个调用方顺序的调用图 因为B1、B2和B3共享相同的调用者顺序(A → D → B),所以它们可以汇总在一起,如下所示。 同样,C1和C3被聚合在一起,因为它们也共享相同的调用者顺序(A → D → B → C)—请注意,C2不包括在内,因为它具有不同的调用者顺序(A → D → C)。 图5。将共享相同调用堆栈的相同函数的函数调用相加,用于创建火焰图,如图6所示。 请注意,对于火焰图中任何给定的函数调用,首先显示消耗CPU时间最多的被调用者。 6.图4中显示的调用图的火焰图表示显示了使用自顶向下和自底向上检查和跟踪自顶向下标签的函数调用列表,该列表中的函数节点将显示该函数的被调用者。 图7示出了图3中呼叫图表的“自上而下”图表。 图中的每个箭头都从调用者指向被调用者。 如图7所示,在“自顶向下”选项卡中执行函数A的节点可以显示其被调用者,即函数B和d。 然后,执行函数D的节点可以显示它的被调用者,即函数B和C,依此类推。 与Flame chart标记类似,“自上而下”树总结了共享相同调用堆栈的相同函数的跟踪信息。 也就是说,火焰图标签可以提供自上而下标签的图形表示。 Top Down标签提供了以下信息来帮助解释每个函数调用所花费的CPU时间(该时间也可以表示为总线程时间占所选时间范围持续时间的百分比):Self:表示函数调用在执行自己的代码(不是被调用方的代码)时所花费的时间,如图3中的函数D所示。 Children:表示函数调用执行自己的被调用者(而不是自己的代码)所花费的时间,如图3中的函数D所示。 Sum:一个函数的自身和子时间的总和。 这表示应用程序执行函数调用所花费的总时间,如图3中的函数D所示。 图7/8 7/8自下而上选项卡显示函数调用列表,其中函数节点将显示函数的调用者。 使用图7所示的跟踪示例,图8为函数c提供了一个“自底向上”的树。 在“自下而上”树中打开函数C的节点,以显示其唯一的调用者,即函数B和d。 注意,虽然B调用了C两次,但是在“自下而上”树中展开函数C的节点时,B只显示一次。 然后,开发B的节点显示它的调用者,即函数A和d。 自下而上标签用于根据消耗最多(最少)的CPU时间对函数进行排序。 您可以检查每个节点,以确定哪些调用者在调用函数上花费了最多的CPU时间。 与“自上而下”的树相比,“自下而上”的树中每个函数的时间信息指的是每棵树顶部的函数(顶层模式)。 CPU时间也可以表示为记录期间总线程时间的百分比。 下表有助于解释如何解释顶层节点及其调用函数(子节点)的时间信息。 在SelfChildren总数的“自下而上”树的顶部的函数(顶部模式)指示函数在执行它自己的代码(而不是它的被调用者的代码)时所花费的时间。 与“自上而下”树相比,该时间信息表示在记录的持续时间内对该函数的所有调用的总和。 指示函数执行其被调用方而不是其自己的代码所花费的总时间。 与“自上而下”树相比,该时间信息表示在记录的持续时间内对该函数的被调用者的所有调用的总和。 自己时间和孩子时间的总和 调用方函数(子节点)表示被调用方调用时被调用方的总自身时间。 以图8中的“自底向上”树为例。当被B调用时,函数B的自身时间将等于函数c每次执行的自身时间之和。 表示被调用方调用时被调用方的总子时间。 以图8中的“自底向上”树为例。当被B调用时,函数B的子时间将等于函数c每次执行的子时间之和。 自己时间和孩子时间的总和 简单了解了各个选项的功能后,我们来为上面的演示练习一下。这里,我们选择自下而上的选项。从上图可以看出,每个函数显示的信息是:Total(函数花费的总时间)、%(百分比)、Self(函数本身花费的时间)、%(百分比)、Children(函数调用的子函数花费的时间)、%( 可以看到main() run()方法的时间主要花在调用子函数上。 那我们就找出最耗时的方法,用Self来排序:image.png。


  • 全部评论(0)
资讯详情页最新发布上方横幅
最新发布的资讯信息
【技术支持|常见问题】1502企业站群-多域名跳转-多模板切换(2024-04-09 12:19)
【技术支持|常见问题】1126完美滑屏版视频只能显示10个(2024-03-29 13:37)
【技术支持|常见问题】响应式自适应代码(2024-03-24 14:23)
【技术支持|常见问题】1126完美滑屏版百度未授权使用地图api怎么办(2024-03-15 07:21)
【技术支持|常见问题】如何集成阿里通信短信接口(2024-02-19 21:48)
【技术支持|常见问题】算命网微信支付宝产品名称年份在哪修改?风水姻缘合婚配对_公司起名占卜八字算命算财运查吉凶源码(2024-01-07 12:27)
【域名/主机/服务器|】帝国CMS安装(2023-08-20 11:31)
【技术支持|常见问题】通过HTTPs测试Mozilla DNS {免费源码}(2022-11-04 10:37)
【技术支持|常见问题】别告诉我你没看过邰方这两则有思想的创意广告! (2022-11-04 10:37)
【技术支持|常见问题】你正确使用https了吗? [php源码](2022-11-04 10:37)

联系我们
Q Q:375457086
Q Q:526665408
电话:0755-84666665
微信:15999668636
联系客服
企业客服1 企业客服2 联系客服
86-755-84666665
手机版
手机版
扫一扫进手机版
返回顶部