性能優化第一步:Profiler的使用

前言

最近申請了一個比較低端的測試機,而後驚訝的發現...咱們的app居然這麼的卡...雖說app卡很煩,可是我又不用,關我啥事~ 不過做爲一個德智體美勞全面發展的新時代程序員,仍是應該「象徵性」的查一下問題。卡頓的出現無非是在主線程裏邊作了耗時操做,影響了主線程對UI的繪製,形成了卡頓的現象。 所以咱們只須要找到主線程中耗時的函數,而後對其進行異步處理便可解決問題。 因此今天我們聊一聊AndroidStudio中檢查函數耗時的工具:CPU Profilerhtml

固然你們也能夠直接參考官方文檔:developer.android.google.cn/studio/prof…android

CPU Profiler

首先來講,CPU Profiler並非專門用於處理頁面卡頓掉幀的,準確說:CPU Profiler是用來查看每一個線程,在某段一段時間內執行了哪些函數,以及在其執行期間每一個函數消耗的 CPU 資源。 專門針對卡頓掉幀問題可使用內置的小工具:systrace程序員

不整官網那麼多「花裏胡哨」的介紹,我們直擊上應用方式。性能優化

一、使用界面

點擊啓動後,咱們就能夠看到以下的內容:網絡

不得不吐槽,Profiler用起來是真的卡app

紅框圈住的內容,從上到下依次是:異步

  • 當前運行的Activity
  • CPU使用狀況
  • 內存使用狀況
  • 網絡使用狀況

咱們點擊一下CPU,就能夠進一步的查看CPU的使用狀況。函數

二、詳細分析

這個圖,表示了當前CPU的使用率,固然這個使用率對應了整個手機,並不能準確的反應咱們本身app的真實狀況。接下來我們針對代碼,來看一下具體的使用:工具

我在代碼裏作了什麼呢?很簡單,一個postdelay,而後裏邊作一個入參爲40的遞歸菲波那切數列。post

Handler().postDelayed({
    fibonacci(40)
}, 20000)

複製代碼

接下讓我們看一下這個函數的耗時。

咱們須要在咱們認爲合適的時機,點一下Record

由於我這裏是delay了20秒,因此我在1七、8秒的時候Record

而後在一個合適的時機,再點一下Stop

而後咱們就會看到這樣的結果:

這樣咱們就能夠很清晰的看到這段時間內產生的函數調用關係。鼠標移到對應的函數,還能夠看到對應的耗時。

所以咱們能夠將這段耗時函數移到異步去作,好比這樣:

不要在乎這瘋狂的Thread使用方式,就是表達一下異步的這麼個意思。哈哈~

Handler().postDelayed({
    Thread {
        fibonacci(40)
    }.start()
}, 20000)
複製代碼

那麼接下來,我們在Record一下:

此時咱們會發現,雖然咱們的CPU使用率在上升,可是對於咱們主線程來講並無任何耗時操做(也就是第二個紅框)。

若是咱們下滑一下選項框,咱們會發現,咱們的耗時操做在這:

當咱們點擊它時,咱們就能夠看到這個線程的函數調用:

三、顯示模式

細心的小夥伴可能注意到了:分析函數調用的時候有四個選項卡可供選擇。

那它們都分別什麼意思呢?這裏簡單的介紹一下:

Call Chart:

x軸表示函數調用(或調用方)的時間段和時間,並沿y軸顯示其被調用者。 對系統 API 的函數調用顯示爲橙色,對應用自有函數的調用顯示爲綠色,對第三方 API(包括 Java 語言 API)的函數調用顯示爲藍色

示意圖相似於這樣:

Flame Chart

俗稱的火焰圖。對於火焰圖來講,它就是彙總了Call Chart,並按照調用順序倒序排列,就像這樣:

Top Down、Bottom Up

這倆種模式相對比較複雜,你們能夠參考官方文檔的解釋配合使用。

尾聲

這篇文章就是我想聊的內容,就是很簡單很簡單的工具應用。可是它表明了你踏出性能優化的第一步,踏出第一步將意味着,後面將有一個又一個坑等着你。

來吧,既然選擇了遠方,便只顧風雨兼程!

我是一個應屆生,最近和朋友們維護了一個公衆號,內容是咱們在從應屆生過渡到開發這一路所踩過的坑,以及咱們一步步學習的記錄,若是感興趣的朋友能夠關注一下,一同加油~

我的公衆號:鹹魚正翻身
相關文章
相關標籤/搜索