Android 性能分析之TraceView使用(應用耗時分析)

Android 性能分析之TraceView使用(應用耗時分析)

本文連接: http://www.javashuo.com/article/p-htczhypr-mb.html

文章概覽:html

  • TraceView概述
  • trace文件的3種生成方式 
    • Android studio 直接生成(推薦)
    • 嵌入代碼代碼生成
    • 使用DDMS來生成
  • TraceView界面及參數介紹
  • 使用TraceView分析,定位問題
  • 相關資料

TraceView概述java

Traceview是android平臺配備一個很好的性能分析的工具。它能夠把trace文件轉化爲圖形,經過圖形化的方式讓咱們瞭解咱們要跟蹤的程序的性能。當你有一個trace 的日誌文件時(經過在程序添加trace代碼或使用DDMS或studio生成),你可使用TraceView加載日誌文件,Traceview 能夠幫助你調試你的應用和分析它的性能。android

trace文件的3種生成方式markdown

  • 第一種,使用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界面及參數介紹性能

  • 界面說明 

    界面主要有上下兩個面板,上面是時間線面板,下面是分析面板。時間線面板描述了線程和方法的開始和結束,分析面板提供了一個方法中發生的狀況信息。時間線面板又能夠分爲兩個部分(左右),暫時分爲三個部分。以下圖標記ui

    • 第一部分(上面板左側).net

      數據中所採集的線程信息,好比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

相關文章
相關標籤/搜索