1. 程式人生 > >效能優化之卡頓分析

效能優化之卡頓分析

Android 每隔16ms發出一個VSYNC訊號,觸發CPU跟GPU進行介面渲染,計算跟繪製,讓介面的幀率在1秒內達到60fps,使視覺效果達到自然流暢。如果一個在16ms內不能完成介面的渲染,計算跟繪製,就會產生丟幀的現象,丟幀就會造成應用卡頓現象。

一、引起應用卡頓的原因

1.過度繪製。過度繪製就是在同一幀情況下對同一塊畫素區域進行重複繪製。這樣會加重GPU跟CPU的渲染壓力,導致渲染時間過長。
2.佈局巢狀過多。佈局巢狀過多過於複雜也會導致CPU跟GPU的渲染,計算,繪製壓力。
3.動畫執行次數過多。
4.執行耗時操作。檔案讀寫,資料操作,較大資料初始化等較為耗時的操作阻塞執行緒。
5.頻繁GC。執行GC的時候,所有操作都需要暫停,等到GC結束後,才能繼續執行操作。這樣就可能會阻塞CPU跟GPU的渲染,計算跟繪製。

二、卡頓的分析步驟思路

分析卡頓主要使用可以檢測UI卡頓的工具來分析,知道了可能引起卡頓的原因後,就可以針對每一點使用相應的工具來檢測分析。我們按順序從第一點開始。

1、檢視過度繪製情況—除錯GPU過度繪製

開啟手機的“除錯GPU過度繪製”功能分析UI的繪製情況
在手機的設定->開發選項->除錯GPU過度繪製 開啟除錯功能。開啟後就可以看到UI的繪製情況了。
可以使用此功能初步檢視UI的繪製情況,然後進行相應的優化。
這裡寫圖片描述
藍色,淡綠,淡紅,深紅代表了4種不同程度的繪製情況,其中藍色表示只繪製一次,最為理想,深紅表示繪製4次以上,效能最差,最為忌諱。對紅色以上部分進行重點優化:

  • 減少背景重疊,儘量在子View設定背景,不要在根View設定背景,防止子View有了背景,根View也有了背景,造成重疊。
  • 減少佈局的巢狀,減少佈局層級。
  • 去除Activity的預設背景色。
  • 在自定義View的onDraw或者自定義ViewGroup的drawChild方法中使用Canvas的clipRect()方法繪製指定區域。

2、檢視佈局巢狀情況—HierarchyViewer

在Android studio的導航欄的Tools->Android->Android Devices Monitor, 選擇Window -> Hierarchy View。
這裡寫圖片描述


使用HierarchyViewer 可以檢視UI的佈局層級,可以看到佈局層級是否過深,是否可以再進一步優化。

3、檢視執行耗時情況—systrace + traceview

Systrace 檢視UI繪製的幀率情

Systrace 可以用來分析由於丟失幀而導致的UI卡頓問題。當出現丟幀時,會以 Alert 提示並給出優化的提示。
Systrace會自動分析資訊,將效能問題直接以alerts的方式高亮顯示。

1、生成 trace 檔案
啟動Systrace:Android Studio,Tools–android–Android Device Monitor,再點選DDMS的Systrace圖示。
這裡寫圖片描述
啟動之後,生成trace.html 檔案,在Chorme瀏覽器中開啟進行分析:
這裡寫圖片描述
2、分析問題
F圓圈表示一幀(Frame),有綠,黃,紅三種狀態,渲染時間依次遞增。
正常繪製是1秒60幀,大約一幀16.6毫秒,在這個值以下是正常顏色綠色,如果超過它就會變成紅色、黃色。一般紅色就是有問題的,要優化的地方。。單點選後可檢視Frame詳細資訊,根據Alert提示解決問題。
點選某個單獨的 Frame,按下m鍵可以看到該 Frame 的執行時間。並且通過alerts提示該展現問題,以及建議如何處理。
這裡寫圖片描述
在左下角我們可以看到 “Scheduling delay”這條Alert提示裡。
Scheduling delay(排程延遲)的意思就是一個執行緒在處理一塊運算的時候,在很長一段時間都沒有被分配到CPU上面做運算,從而導致這個執行緒在很長一段時間都沒有完成工作。
2、程式碼控制開始和結束
以上方式不能在程式碼中控制Trace執行的開始和結束,那有沒有辦法呢?答案是肯定的。
Android定義了一個Trace類,這個 Trace 類就是用來做資料採集的。我們可以用這個類來自定義Trace Label ,解決在程式碼中控制開始和結束。可以在程式碼中插入如下程式碼來分析某個特定的過程:

//生成的trace檔案中,會在跟蹤的程式碼段執行對應時間軸區間打上一個tag標記
Trace.beginSection("Trace begin");  
...
//Trace的begin與end必須在同一執行緒之中執行
Trace.endSection(); 
Traceview分析函式執行時間

使用systrace分析之後,並不能定位到具體的程式碼,這時就可以使用 Traceview 來定位具體的程式碼了。
Traceview可以清晰地看到每個方法的執行耗時和呼叫次數,然後定位具體的卡頓程式碼。

1、生成 trace 檔案

  • 使用程式碼
  • 使用DDMS

1.1 使用程式碼生成 trace 檔案

Debug.startMethodTracing(String tracePath);
//...
Debug.stopMethodTracing();

1.2 使用DDMS生成 trace 檔案
在Android studio的導航欄的Tools->Android->Android Devices Monitor選擇DDMS,然後點選Start Method Profiling,即可開始:
這裡寫圖片描述
然後操作我們需要檢測的介面,過一會之後,再點選這個按鈕,即可停止。DDMS就會自動開啟如下介面:
這裡寫圖片描述

Name:名稱
Incl Cpu Time :方法及其呼叫方法總共佔用CPU的時間。
Excl Cpu Time :方法本身佔用CPU的時間。
Incl Real Time :方法及其呼叫方法真實執行時間。
Excl Real Time :方法本身真實執行時間。
Calls+Recur Calls/Total:方法被呼叫次數以及遞迴呼叫次數佔總呼叫次數的百分比
Cpu Time/Calls:方法執行的平均佔用CPU時間。
Real Time/Calls:方法執行的平均真實執行時間。

2、定位問題
使用Traceview,一般可以定位兩類函式:

  • 執行時間比較長。
    點選 TraceView 中的 Incl Real Tim,按照方法執行時間從高到低排序
  • 執行時間斷,但是呼叫次數過於頻繁的。
    點選 TraceView 中的 Calls + Recur Calls/Total ,按照呼叫次數從高到底排序

我們可以對相關屬性進行排序,加上 Find 搜尋,從而定位執行時間較長的或者呼叫過於頻繁的函式並進行優化。

4、檢視GC情況—Memory Monitor

由於GC導致UI卡頓,這種情況一般可能是由於記憶體抖動,頻繁GC造成的。
可以使用 Allocation Tracker 來檢視是否有記憶體抖動情況, Allocation Tracker可以檢視程式碼中分配的物件型別、大小情況。

在 Android studio 中的 Android Monitor -> Memory Monitor 可以檢視應用的記憶體使用情況,以及實時的GC情況。
點選 Memory Monitor -> Start Allocation Tracker 按鈕開啟追蹤記憶體情況:
這裡寫圖片描述
等程式執行幾秒後,再按一下結束追蹤,會開啟如下分析介面:
這裡寫圖片描述

三、效能監控元件 Blockcanary

Blockcanary 是檢測UI卡頓利器

相關推薦

效能優化分析

Android 每隔16ms發出一個VSYNC訊號,觸發CPU跟GPU進行介面渲染,計算跟繪製,讓介面的幀率在1秒內達到60fps,使視覺效果達到自然流暢。如果一個在16ms內不能完成介面的渲染,計算跟繪製,就會產生丟幀的現象,丟幀就會造成應用卡頓現象。

效能優化分析-計算並優化記憶體抖動和耗時操作

1 卡頓(卡UI執行緒) (1)外部引起的:Activity裡面直接進行網路訪問/大檔案的IO操作。 (2)記憶體引起的:記憶體抖動的問題,new Object obj = null;執行耗時方法。 (3)View本身的卡頓:自定義View要注意的,能否優

App效能優化終極原因研究及總結

熱文導讀 | 點選標題閱讀來源:CoorChicehttps://www.jianshu.com

效能優化MQ問題分析及解決方案

問題現象描述 傳送訊息或者接收訊息不能正常進行,訪問ActiveMQ掛起,互動無響應。 ActiveMQ報記憶體溢位。 重啟ActiveMQ後控制恢復正常。 分析過程 1) ActiveMQ訊息傳送有兩種方式:同步和非同步。一般為提高訊息處理能力,通過非同步方

Android優化分析方法

rtm 主動 無法 基本 渲染 線程數 star 設備 當前 基礎知識在具體講卡頓工具前,你需要了解一些基礎知識,它們主要都和 CPU 相關。造成卡頓的原因可能有千百種,不過最終都會反映到CPU 時間上。我們可以把 CPU 時間分為兩種:用戶時間和系統時間。用戶時間就是執行

iOS應用千萬級架構:效能優化監控

CPU和GPU 在螢幕成像的過程中,CPU和GPU起著至關重要的作用 CPU(Central Processing Unit,中央處理器) 物件的建立和銷燬、物件屬性的調整、佈局計算、文字的計算和排版、圖片的格式轉換和解碼、影象的繪製(Core Graphics) GPU(Graphics Processin

Android 效能優化記憶體檢測、優化、耗電優化、APK瘦身

導語 自2008年智慧時代開始,Android作業系統一路高歌,10年智慧機發展之路,如今 Android 9.0 代號P  都發布了,Android系統性能已經非常流暢了。但是,到了各大廠商手裡,改原始碼自定系統,使得Android原生系統變得魚龍混雜。另外,到了不同層次的

Android效能優化第(十 一)篇---分析,正確評測流暢度

一、FPS評測應用流暢度不準確 說到應用的流暢度,都會想到FPS,系統獲取FPS的原理是:手機螢幕顯示的內容是通過Android系統的SurfaceFLinger類,把當前系統裡所有程序需要顯示的資訊合成一幀,然後提交到螢幕上進行顯示,FPS就是1秒內Surf

效能優化效能分析簡介

 效能優化是幾乎所有軟體開發過程都要考慮的事情。通常效能消耗符合二八定律,即20%的程式碼消耗了80%的效能,所以效能優化需要排查哪些地方最消耗效能。解決了最消耗效能的幾個關鍵點,就能使效能得到大幅度的提升。       &n

iOS開發優化tableView現象

1.複用單元格; 2.使用不透明的試圖,單元格中儘量少使用動畫; 3.圖片使用非同步載入同時設定圖片載入的併發數; 4.滑動時不載入圖片,滑動結束開始載入; 5.文字圖片可以直接drawInRect繪製; 6.非必要條件下,減少重新整理的cell; 7.如果ce

效能測試壓力機瓶頸分析優化

效能測試過程中,為了給伺服器足夠的壓力,少不了要使用壓力機,即模擬客戶端的機器,壓力機如果使用不當,測試結果就會不準確,反映不了伺服器的真實效能情況。 因此,我們需要充分了解壓力機,並對其進行調優,從而避免壓力機自身瓶頸對壓測帶來影響,為效能測試結果的準確可靠

python效能優化函式執行時間分析

最近發現專案API請求比較慢,通過抓包發現主要是response時間太長,於是就開始進行優化工作。優化工作的關鍵一步是定位出問題的瓶頸,對於優化速度來說,從優化函式執行時間這個維度去切入是一個不錯的選擇。 本文側重分析,不展開如何優化 利器 工欲善其事,必先利其器,我們需要一套方便高效的工具記

Android效能優化 App啟動原理分析及速度和時間優化

應用的啟動速度緩慢這是很多開發者都遇到的一個問題,比如啟動緩慢導致的黑屏,白屏問題,大部分的答案都是做一個透明的主題,或者是做一個Splash介面,但是這並沒有從根本上解決這個問題。那麼如何從根本上解決這個問題或者做到一定程度的緩解? 一、應用的啟動方式 1、冷啟動:

Oracle效能優化統計分析

        Statistic 對oracle 是非常重要的。 它會收集資料庫中物件的詳細資訊,並存儲在相應的資料字典裡。 根據這些統計資訊, optimizer 可以對每個SQL 去選擇最好的執行計劃。所以我們每天應該設定一個計劃來定時統計分析相關資訊。具體計劃如下:

React效能優化PureComponent 和 memo使用分析

前言 關於react效能優化,在react 16這個版本,官方推出fiber,在框架層面優化了react效能上面的問題。由於這個太過於龐大,我們今天圍繞子自元件更新策略,從兩個及其微小的方面來談react效能優化。 其主要目的就是防止不必要的子元件渲染更新。 子元件何時更新? 首先我們看個例子

前端效能優化利用 Chrome Dev Tools 進行頁面效能分析

背景 我們經常使用 Chrome Dev Tools 來開發除錯,但是很少知道怎麼利用它來分析頁面效能,這篇文章,我將詳細說明怎樣利用 Chrome Dev Tools 進行頁面效能分析及效能報告資料如何解讀。 分析面板介紹 上圖是 Chrome Dev Tools 的一個截圖,其中,我認為能用於進行頁面

android問題及其解決-優化listView和怎樣禁用ListView的fling

cati 依據 過程 none mst 角度 解決問題 ces 開心 問題解決-優化listView卡頓和怎樣禁用ListView的fling 前戲非常長,轉載請保留出處:http://blog.csdn.net/u012123160/ar

iOS性能優化Leaks動態分析

反向輸出 ges 合並 性能優化 recursion 問題 details auto 14. iOS性能優化之Leaks動態分析 Instruments-Leaks有很多跟蹤模塊可以動態分析和跟蹤內存, CPU 和文件系統(因為是動態分析 所以必須運行才能打開)。 具體

菜鳥要做架構師——java效能優化for迴圈

完成同樣的功能,用不同的程式碼來實現,效能上可能會有比較大的差別,所以對於一些效能敏感的模組來說,對程式碼進行一定的優化還是很有必要的。今天就來說一下java程式碼優化的事情,今天主要聊一下對於for(while等同理)迴圈的優化。 作為三大結構之一的迴圈,在我們編寫程式碼的時候會經常用到。

效能優化記憶體優化

效能優化之記憶體優化 計算 APP 獲得的最大記憶體分配值 Runtime rt=Runtime.getRuntime(); long maxMemory=rt.maxMemory(); Log.i("maxMemory:",Long.toString(max