轉(zhuǎn)自:http://www.elsyy.com/news/2014/1028/13722261490.html
TraceView界面
現(xiàn)來看一下整個界面的圖,整個界面包括上下兩部分,上面是你測試的進程中每個線程的執(zhí)行情況,每個線程占一行;下面是每個方法執(zhí)行的各個指標的值
上面一部分是你測試進程的中每個線程運行的時間線,下圖中可以可以看到,主要只有一個main線程在執(zhí)行,因為我滑動了一下列表,main線程(UI線程)正在進行繪制View呢~ 附相關(guān)視頻教程Android應(yīng)用開發(fā)視頻教程
然后我點擊了序號為133的一個方法io.bxbxbai.android.examples.activity.ExpandableLayoutMainActivity$SimpleAdapter.getItemView,就會出現(xiàn)兩部分數(shù)據(jù):
? Parents
? Children
Parents表示調(diào)用133這個方法的父方法,可以看到序號為130。Children表示方法133調(diào)用的其他方法,可以看到有好幾個方法。
如何使用TraceView
因為這次我主要是分析列表滑動卡頓問題,我就講講我是怎么使用這個工具的,并且我是怎么分析的。
使用TraceView主要有兩種方式:
1. 最簡單的方式就是直接打開DDMS,選擇一個進程,然后按上面的“Start Method Profiling”按鈕,等紅色小點變成黑色以后就表示TraceView已經(jīng)開始工作了。然后我就可以滑動一下列表(現(xiàn)在手機上的操作肯定會很卡,因 為Android系統(tǒng)在檢測Dalvik虛擬機中每個Java方法的調(diào)用,這是我猜測的)。操作最好不要超過5s,因為最好是進行小范圍的性能測試。然后再按一下剛才按的按鈕,等一會就會出現(xiàn)上面這幅圖,然后就可以開始分析了。
2. 第2種方式就是使用android.os.Debug.startMethodTracing();和android.os.Debug.stopMethodTracing();方法,當(dāng)運行了這段代碼的時候,就會有一個trace文件在/sdcard目錄中生成,也可以調(diào)用startMethodTracing(String traceName) 設(shè)置trace文件的文件名,最后你可以使用adb pull /sdcard/test.trace /tmp 命令將trace文件復(fù)制到你的電腦中,然后用DDMS工具打開就會出現(xiàn)第一幅圖了
第一種方式相對來說是一種簡單,但是測試的范圍很寬泛,第二中方式相對來說精確一點,不過我個人喜歡使用第一種,因為簡單,而且它是檢測你的某一個操作。因為第二中更適合檢測某一個方法的性能,其實也沒有那種好,看使用的場景和喜好了。。。
看懂TraceView中的指標
其實我今年7月份就已經(jīng)開始使用TraceView工具了,但是當(dāng)時不懂其中每個指標的含義,就沒注意到它強大的地方。看不懂界面下方表格中的指標,這些數(shù)據(jù)其實一點意義都沒有。
網(wǎng)上包括Android官網(wǎng)也沒有對TraceView工具的使用有詳細的說明文檔,這點確實比較蛋疼。
縱軸
TraceView界面下方表格中縱軸就是每個方法,包括了JDK的,Android SDK的,也有native方法的,當(dāng)然最重要的就是app中你自己寫的方法,有些Android系統(tǒng)的方法執(zhí)行時間很長,那么有很大的可能就是你app中調(diào)用這些方法過多導(dǎo)致的。
每個方法前面都有一個數(shù)字,可能是全部方法按照Incl CPU Time 時間的排序序號(后面會講到)
點一個方法后可以看到有兩部分,一個是Parents,另一個是Children。
? Parent表示調(diào)用這個方法的方法,可以叫做父方法
? Children表示這個方法中調(diào)用的其他方法,可以叫做子方法
橫軸
橫軸上是很多指標,這些指標表示什么意思真的困擾了我很長一段時間。。。
能夠很衡量一個方法性能的指標應(yīng)該只有時間了吧? 一個方法肯定就是執(zhí)行時間越短約好咯~~
1. Incl Cpu Time
define inclusive : 全包括的
上圖中可以看到0(toplevel) 的Incl Cpu Time 占了100%的時間,這個不是說100%的時間都是它在執(zhí)行,請看下面代碼:
public void top() {
a();
b();
c();
d();
}
Incl Cpu Time表示方法top執(zhí)行的總時間,假如說方法top的執(zhí)行時間為10ms,方法a執(zhí)行了1ms,方法b執(zhí)行了2ms,方法c執(zhí)行了3ms,方法d執(zhí)行 了4ms(這里是為了舉個栗子,實際情況中方法a、b、c、d的執(zhí)行總時間肯定比方法top的執(zhí)行總時間要小一點)。
而且調(diào)用方法top的方法的執(zhí)行時間是100ms,那么:
Incl Cpu Time
top 10%
a 10%
b 20%
c 30%
d 40%
從上面圖中可以看到:
toplevel的 Incl Cpu Time 是1110.943,而io.bxbxbai.android.examples.activity.ExpandableLayoutMainActivity$SimpleAdapter.getItemView方法的Incl Cpu Time為12.859,說明后者的Incl Cpu Time % 約為1.2%
這個指標表示 這個方法以及這個方法的子方法(比如top方法中的a、b、c、d方法)一共執(zhí)行的時間
2. Excl Cpu Time
理解了Incl Cpu Time以后就可以很好理解Excl Cpu Time了,還是上面top方法的栗子:
方法top 的 Incl Cpu Time 減去 方法a、b、c、d的Incl Cpu Time 的時間就是方法top的Excl Cpu Time 了
3. Incl Real Time
這個感覺和Incl Cpu Time 差不多,第7條會講到。
4. Excl Real Time
同上
5. Calls + Recur Calls / Total
這個指標非常重要!
它表示這個方法執(zhí)行的次數(shù),這個指標中有兩個值,一個Call表示這個方法調(diào)用的次數(shù),Recur Call表示遞歸調(diào)用次數(shù),看下圖:
我選中了一個方法,可以看到這個方法的Calls + Recur Calls 值是14 + 0,表示這個方法調(diào)用了14次,但是沒有遞歸調(diào)用
從Children這一塊來看,很多方法調(diào)用都是13的倍數(shù),說明父方法中有一個判斷,但是這不是重點,有些Child方法調(diào)用Calls為26,這說明了這些方法被調(diào)用了兩遍,是不是可能存在重復(fù)調(diào)用的情況?這些都是可能可以優(yōu)化性能的地方。
6. Cpu Time / Call
重點來了!!!!!!!!!!
這個指標應(yīng)該說是最重要的,從上圖可以看到,133這個方法的調(diào)用次數(shù)為20次,而它的Incl Cpu Time為12.859ms,那么133方法每一次執(zhí)行的時間是0.643ms(133這個方法是SimpleAdapter的getItemView方法)
對于一個adapter的getView方法來說0.643ms是非常快的(因為這個adapter中只有一個TextView,我為了測試用的)
如果getView方法執(zhí)行時間很長,那么必然導(dǎo)致列表滑動的時候產(chǎn)生卡頓現(xiàn)象,可以在getView方法的Children方法列表中找到耗時最長的方法,分析出現(xiàn)問題的原因:
? 是因為有過多的計算?
? 還是因為有讀取SD卡的操作?
? 還是因為adapter中View太復(fù)雜了?
? 還是因為需要有很多判斷,設(shè)置View的顯示還是隱藏
? 還是因為其他原因…
7. Real Time / Call
Real Time 和 Cpu Time 我現(xiàn)在還不太明白它們的區(qū)別,我的理解應(yīng)該是:
? Cpu Time 應(yīng)該是某個方法占用CPU的時間
? Real Time 應(yīng)該是這個方法的實際運行時間
為什么它們會有區(qū)別呢?可能是因為CPU的上下文切換、阻塞、GC等原因方法的實際執(zhí)行時間要比Cpu Time 要稍微長一點。
總結(jié)
TraceView是一個非常強大的性能分析工具,因為Android 官網(wǎng)對這個工具的使用介紹文檔很少,而且一些中文博客中寫的也都是抄來抄去,沒有講到底怎么使用。更多關(guān)于Android方面的技術(shù)交流請關(guān)注e良師益友 。相關(guān)參考資料請看:http://www.elsyy.com/sale/icebox.html
最近我在做這方面的性能分析,就慢慢琢磨了這么工具的使用,發(fā)現(xiàn)非常強大,寫下來總結(jié)一下。
Android的性能分析工具還有很多,比如:
? Eclipse Memory Analyzer Tool 來分析Android app的內(nèi)存使用
? Dump UI Hierarchy for UI Atomator,分析UI層級
? systrace
? 其他
下圖這一條工具欄中有很多性能分析工具~~~
總結(jié)
以上是生活随笔 為你收集整理的TraceView的使用 的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔 推薦給好友。