zoukankan      html  css  js  c++  java
  • Android 性能分析之TraceView使用(应用耗时分析)

    Android 性能分析之TraceView使用(应用耗时分析)

    本文链接:https://blog.csdn.net/ecliujianbo/article/details/76608558

    文章概览:

    • TraceView概述
    • trace文件的3种生成方式 
      • Android studio 直接生成(推荐)
      • 嵌入代码代码生成
      • 使用DDMS来生成
    • TraceView界面及参数介绍
    • 使用TraceView分析,定位问题
    • 相关资料

    TraceView概述

    Traceview是android平台配备一个很好的性能分析的工具。它可以把trace文件转化为图形,通过图形化的方式让我们了解我们要跟踪的程序的性能。当你有一个trace 的日志文件时(通过在程序添加trace代码或使用DDMS或studio生成),你可以使用TraceView加载日志文件,Traceview 可以帮助你调试你的应用和分析它的性能。

    trace文件的3种生成方式

    • 第一种,使用android studio 直接生成(推荐)

      操作: 
      1,点击Monitors–>CPU栏目上的小闹钟(如下图),开始记录。

      2,操作你手机需要分析的功能。比如,UI卡顿那块,应用耗时那块..

      3,在此点击Monitors–>CPU栏目上的小闹钟(如下图),结束记录,这是会生成trace文件。(可以点击studio 左侧的Captures。它里面的Method Tracing 里面可以看到)

      4,这个时候,studio会自动打开这个trace文件。(很可惜,这次说的不是它)

    • 第二种,嵌入代码代码生成

      使用 
      android.os.Debug.startMethodTracing(String traceName);
      android.os.Debug.stopMethodTracing(); 
      这两个方法添加到你想分析的那些代码中,当程序运行了这段代码,就会在/sdcard 
      目录中生成一个traceName命名的trace文件。

    • 第三种,使用DDMS来生成

      1,选中Devices里面,你想查看的进程。然后点击,start Method Profiling,如下图

      2,操作你手机想调试的那部分功能

      3,再次点击那个按钮Stop Method Profiling 

    TraceView界面及参数介绍

    • 界面说明 

      界面主要有上下两个面板,上面是时间线面板,下面是分析面板。时间线面板描述了线程和方法的开始和结束,分析面板提供了一个方法中发生的情况信息。时间线面板又可以分为两个部分(左右),暂时分为三个部分。如下图标记

      • 第一部分(上面板左侧)

        数据中所采集的线程信息,比如main线程等等

      • 第二部分(上面板的右侧) 
        时间线上是每个线程在这个时间段内所涉及的函数调用信息(空白的位置表示当时没有在执行),每个方法用一种颜色显示(颜色循环使用),当鼠标放到不同的位置可以看到,当时执行执行的方法,以及相关信息。
      • 第三部分(下方面版) 
        下半部分表示这段时间执行的方法,及每个方法执行的信息分析(比如,占用CPU的时间,调用、递归次数等等),参考参数说明



    • 参数说明 

      下方面板中数据对应的列名(上图红框那一行) 
      • Calls+RecurCalls/Total (重要) 
        某函数运行,调用、递归的次数
      • Cpu Time/Call (重要) 
        某函数运行,占用CPU的时间
      • Real Time/Call (重要) 
        某函数运行,平均的执行时间
      • incl Cpu Time 
        某函数运行,占用CPU的时间(包括其内部函数调用的时间)
      • Excl Cpu Time 
        某函数运行,占用CPU的时间(不包括其内部函数调用的时间)
      • incl Real Time 
        某函数运行,运行的真实时间(不包括其内部函数调用的时间)
      • Excl Real Time 
        某函数运行,运行的真实时间(不包括其内部函数调用的时间)

    使用TraceView分析,定位问题

    上面给几个参数标记了重要,下面我们来想下为什么呢? 
    我们在分析耗时的时候一般有两种情况:

    - 1,调用次数不多。但是,本身就非常耗时。 
    - 2,本身不是很耗时。但是,调用非常频繁。

    1,第一种情况,我们可以使用 Cpu Time 来查看它的耗时情况。 
    2,第二种情况,我们可以使用 Calls+RecurCalls/Total 来查看它的调用情况。

    现在,我们模拟,使用CPU Time来分析

    • 第一步,点击CPU Time列,让函数从高到底排列,并找到我们项目的方法点击进入,如下图 

      我们发现里面分为Parents和Children。 

      Parents:自身函数。 
      Children:调用内部的函数。 
      然后,我们找到了drawRegionV2的函数

    • 第二步,点击drawRegionV2函数,一步步找进去,getPoints()->toFloat(),最后,如下图

    • 第三步,查看我们的代码,并解决问题。 

      java代码

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30


    最后,发现了ondraw里面的toFloat()函数的BigDecimal。执行一次getPoints函数就会创建好几个函数的BigDecimal对象,而且还是在Ondraw里面。 

    分析到这里,我们已经定位到问题了。

    相关资料

    https://developer.android.com/studio/profile/traceview-walkthru.html

    https://developer.android.com/studio/profile/traceview.html#traceviewLayout

    http://blog.csdn.net/androiddevelop/article/details/8223805

    http://blog.csdn.net/u011240877/article/details/54347396

    http://www.cnblogs.com/sunzn/p/3192231.html

    http://www.jianshu.com/p/ba630177d85a

  • 相关阅读:
    React在componentDidMount里面发送请求
    React 术语词汇表
    React里受控与非受控组件
    React和Vue等框架什么时候操作DOM
    【LeetCode】79. Word Search
    【LeetCode】91. Decode Ways
    【LeetCode】80. Remove Duplicates from Sorted Array II (2 solutions)
    【LeetCode】1. Two Sum
    【LeetCode】141. Linked List Cycle (2 solutions)
    【LeetCode】120. Triangle (3 solutions)
  • 原文地址:https://www.cnblogs.com/tonny-li/p/11656510.html
Copyright © 2011-2022 走看看