兩篇文章一起看,基本就懂了
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匯出到指定目錄。
後面會著重講開啟.trace檔案且分析.trace檔案的方法。
c:分析完成後會開啟.trace檔案如下圖,這個介面的底部的搜尋功能不可用,而且我們經常需要搜尋功能,所以我的習慣也是
不採用這種方式產生的.trace檔案。
到此,三種獲取.trace檔案的方式講完了,第一種方式和第二種方式我們都獲取到了.trace檔案,第三種方式我一般不採用。
前面講到的方式一方式二我們獲取到了.trace,下面講解如果開啟並分析該.trace檔案
要開啟.trace檔案就用到了sdk目錄下的d:\sdk\tools\traceview.bat工具,通過如下命令就開啟.trace檔案並進入分析介面
由於通常我們的業務**比較複雜,產生的.trace檔案也很複雜不方便我們學習,所以這裡我自己寫一段非常簡單的**並通過前面方式一講到的通過**的方式獲取.trace檔案來講解。
private void test()
/** * jie1()和jie2()沒有呼叫關係是兄弟關係
*/private void starttrace()
/** * jie2()中兩次呼叫jie3(),其中jie3(0)直接return,不產生遞迴也不會呼叫jie4()
* jie3(3)會先呼叫一次jie4()再產生3次遞迴呼叫
*/private void jie2()
private void jie3(int count)
if (count == 0) else
}/**
* 故意做比較耗時的操作:用於區分excl和incl的關係
*/private void jie4()
}}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()
這裡程式設計師主動呼叫了兩次funcb()一次funcd(),並沒有管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的使用詳解
1 ddms與traceview的區別 ddms是乙個集除錯 瀏覽 控制等操作為一體的工具箱,而traceview只是乙個效能調優工具,可通過它檢視程式中方法的執行效率等指標。2 traceview的使用 traceview的開啟有兩種方式 最簡單的方式就是直接開啟ddms,選擇乙個程序,然後按上面...
mysql效能優化 mysql效能優化
優化方式 1.空間換時間 冗餘 2.時間換空間 字段優先使用型別 int date char varchar text 索引型別 btree索引 hash索引 索引的葉子下,存放乙個資訊指向所在行的資料位址。btree有利於範圍查詢,hash有利於精確查詢。btree用的更多一些。btree索引的常...
效能優化 電量優化
使用battery historian來監測電量的情況,battery historian時google的乙個開源專案 具體安裝過程參見 當出現下列畫面,說明已經開啟 其開啟成功以後,訪問網頁如下所示 說明 這裡使用的是一台國外的vps伺服器,原本是想在本地虛擬機器實驗的,一直連線超時,就換成了vp...