就这一次看懂TraceView
生活随笔
收集整理的這篇文章主要介紹了
就这一次看懂TraceView
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、TraceView的用處
TraceView用于分析計算性能,流入某個方法過于耗時導致UI卡頓,或者某個方法調用次數過多,或者某個方法雖然并不占用太多內存但是占用了大量的CPU資源等等。二、獲取TraceView文件的三種方式
1:方式一:通過代碼獲取
case R.id.bt_trace_view:Debug.startMethodTracing("custom"); startTrace(); Debug.stopMethodTracing(); Utils.showToast(this, "成功"); break;a:在你想要檢測的某段代碼的開始位置調用Debug.startMethodTracing("custom");
其中custom可根據需要自定義,其實就是生成的TraceView文件的文件名,例如custom.trace
b:在你想要檢測的某段代碼的結束位置調用
Debug.stopMethodTracing();
結束檢測沒有參數。
注意:這兩行代碼要在同一個線程成對出現。
c:通過以上設置運行代碼后就會在手機里生成/sdcard/custom.trace文件
d:然后通過adb pull /sdcard/custom.trace D:\folder命令將custom.trace導出到指定目錄。
2:方式二:通過Android Studio的Monitor的CPU模塊生成
a:保持app在運行狀態,在你要開始檢測某個功能時點擊一下按鈕Start Method Tracing;
b:根據需要操作一下app,再點擊該按鈕Stop Method Tracing,則檢測區間結束,Studio會打開.trace文件的查看窗口,這個.trace文件在你app項目的captures目錄下。
c:這個窗口界面并不友好,也不好用,我們不直接觀察這個界面,所以我們像方式一一樣將這個.trace文件保存到某個目錄。
這里為了和上面的方式一統一,我也把這個文件保存到D:\folder,并且重命名為custom.trace文件。
后面會著重講打開.trace文件且分析.trace文件的方法。
3:通過Tools --> Android --> Android Device Monitor獲取
a:通過Tools --> Android --> Android Device Monitor路徑進入,然后參考下圖開始分析;
b:操作一會app后參考下圖結束分析你剛才的操作執行的代碼;
不采用這種方式產生的.trace文件。
到此,三種獲取.trace文件的方式講完了,第一種方式和第二種方式我們都獲取到了.trace文件,第三種方式我一般不采用。
三:分析trace文件
前面講到的方式一方式二我們獲取到了.trace,下面講解如果打開并分析該.trace文件要打開.trace文件就用到了sdk目錄下的D:\sdk\tools\traceview.bat工具,通過如下命令就打開.trace文件并進入分析界面
由于通常我們的業務代碼比較復雜,產生的.trace文件也很復雜不方便我們學習,所以這里我自己寫一段非常簡單的代碼并通過前面方式一講到的通過代碼的方式獲取.trace文件來講解。
private void test() {Debug.startMethodTracing("custom"); startTrace(); Debug.stopMethodTracing(); Utils.showToast(this, "成功"); }/** * jie1()和jie2()沒有調用關系是兄弟關系 */ private void startTrace() {jie1(); jie2(); }/** * jie2()中兩次調用jie3(),其中jie3(0)直接return,不產生遞歸也不會調用jie4() * jie3(3)會先調用一次jie4()再產生3次遞歸調用 */ private void jie2() {jie3(0); jie3(3); }private void jie3(int count) {if (count == 3) {jie4(); }if (count == 0) {return; } else {jie3(count - 1); } }/** * 故意做比較耗時的操作:用于區分Excl和Incl的關系 */ private void jie4() {for (int i = 0; i < 15; i++) {for (int j = 0; j < 15; j++) {int k = i + j; }} }private void jie1() {}這段代碼對應的.trace文件如下圖
其中各個字段的說明:
Incl Cpu Time%Incl Cpu Time
某函數占用的CPU時間,包含內部調用其它函數的CPU時間
Excl Cpu Time%?
Excl Cpu Time
某函數占用的CPU時間,但不含內部調用其它函數所占用的CPU時間
結論:父方法的Incl Cpu Time = 父方法的Excl Cpu Time + 子方法的Incl Cpu Time.... ?省略號說明一個方法可以調用多個方法
Incl Real Time%
Incl Real Time
某函數運行的真實時間(以毫秒為單位),內含調用其它函數所占用的真實時間
Excl Real Time%
Excl Real Time
某函數運行的真實時間(以毫秒為單位),不含調用其它函數所占用的真實時間
結論:父方法的Incl Real Time = 父方法的Excl Real Time + 子方法的Incl Real Time....省略號說明一個方法可以調用多個方法
Call+Recur Calls/Total
沒展開某個方法時:
會顯示該方法被程序員主動調用次數,以及被自身遞歸調用次數;例如:2+3,程序員調用兩次,自己遞歸調用3次
展開某個方法時:
父方法會顯示:其調用(程序員主動調用,非遞歸)該方法的次數/該方法的總次數,例如:2/5,說明該方法總共被調用5次其中父方法主動調了他2次
子方法會顯示:子方法被其調用(程序員主動調用)的次數/子方法被調用的總次數,例如1/5
注意:這里的程序員主動調用是指,你看到的代碼調用了幾次就是幾次,并不包括代碼運行中的遞歸
例如funcA(){
funcD();
funcB();
funcB();
}
這里程序員主動調用了兩次funcB()一次funcD(),并沒有管funcB()有沒有遞歸的情況。
再例如funcB(){
funcB();
funcB();
}
這里funcB()產生了遞歸,但是程序員在funcB()中只主動調用了2次funcB();不管funcB()遞歸了多少次。
Cpu Time/Call
某函數的Incl Cpu Time與調用次數的比。相當于該函數平均執行時間,注意不是Excl Cpu Time;
Real Time/Call
某函數的Incl Real Time與調用次數的比。相當于該函數平均執行時間,注意不是Excl Real Time;
注意:這些列可以左右拖動調換位置
通過對TraceView文件的分析,如果發現某個方法運行時間明顯過長或者調用次數異常過多,則就存在優化的可能
總結
以上是生活随笔為你收集整理的就这一次看懂TraceView的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第四届“传智杯”全国大学生IT技能大赛(
- 下一篇: 网络编程:TCP简单实现群聊功能