效能優化 TraceView

2021-09-13 19:50:26 字數 3029 閱讀 9737

兩篇文章一起看,基本就懂了

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...