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

  • 相关阅读:
    vfpConn
    OAuth2.0
    开源日志组件ELMAH
    c# 动态数组 ArrayList
    OleDbHelper类
    系统权限管理框架
    Log4net数据表
    C#创建DBF自由库
    数字化校园passport
    使用 StateServer 保存 Session 解决 Session过期,登陆过期问题。
  • 原文地址:https://www.cnblogs.com/tonny-li/p/11656510.html
Copyright © 2011-2022 走看看