背景
在經典的性能問題中,一般我們會說兩種問題:一種是I/O密集型問題,另外一種就是CPU密集型的問題,今天我就來聊聊如何測試Android應用的 CPU性能。
原理
CPU的問題一般分為以下三類:
1、CPU資源冗餘使用:
關於這個問題的原因,可能是算法太爛,明明可以只遍歷一次卻遍歷了兩次,主要出現在查找、排序、刪除等環節;也可能是沒有用緩存,明明解碼過一次的圖片還重複解碼;還有就是明明使用int就足夠,偏偏要用long,導致CPU的運算壓力多出4倍。
2、CPU資源爭搶:
搶主線程的CPU資源;這是最常見的問題,關鍵是主線程起碼在Android 6.0版之前,沒有renderthread的時候,其繁忙程度就決定了是否會引發用戶的卡頓問題。
搶音視頻的CPU資源;跟主線程的情況不同,音視頻編解碼本身就消耗了大量的CPU資源,同時音視頻編解碼對於解碼的速度是有硬要求的,達不到就會有產生播放流暢度的問題。
大家平等,相互搶,比如你開了20個線程做圖片解碼,那就是相互搶,最終效果就是導致圖片的顯示速度非常慢。
3、CPU資源利用率低:
CPU就是速度與負載的博弈,用得多會耗電、會卡頓,用得少也會有問題,像啟動、界面切換、音視頻編解碼這些場景,為了保證其速度,不好好利用CPU,真對不起核心數的不斷飆升。而導致無法充分利用CPU的因素,除了磁碟和網絡I/O外,還有鎖操作、sleep等。其中鎖的優化,一般在鎖的範圍上,主要是儘可能地縮減範圍。
方案
下面重點講一下做CPU性能測試過程中的採集方法:
1、top命令
top命令大家應該是非常熟悉的了,依靠adb shell top就可以簡單地列出進程的各種信息,缺點就是top本身的性能消耗就不少,所以我們在自動化測試裡面的取值,一般不用top。
2、proc下的CPU信息
Google 在Android Monitor工具中收集CPU的方法也是採用這種方式,這種方式的原理跟top相似,但性能損耗要小很多,建議自動化測試採用這種方式,下面是命令返回欄位的說明:獲取應用pid:
adb shell ps | grep 包名 | awk '{print $2}' | sed -n 1putime + stime + cutime + cstim
adb shell cat /proc/[pid]/stat | awk '{print $14+$15+$16+$17}'對應的指標分別是:user + nice+ system+ idle+ iowait+ irq+ softirq一段時間內應用進程CPU使用率:(進程CPU總時間2-進程CPU總時間1) / (CPU總時間2-CPU總時間1) * 100%
3、dumpsys cpuinfo
adb shell dumpsys cpuinfo | grep 包名這種方式雖然比top更簡潔,但是準確性沒有top高。
推薦閱讀:
Android應用啟動流量自動化測試
快速查看Android原生應用中的H5頁面
Android應用權限檢查
在看和轉發是更好的支持