page.title=測試顯示效能 page.image=images/cards/card-test-performance_2x.png page.keywords=效能, fps, 工具 @jd:body
使用者介面效能測試可確保您的應用程式不只符合功能需求,與使用者與應用程式的互動也無比順暢,執行時每秒一致有 60 個畫面 (為什麼 60fps?),任何畫面都不會遺漏或延遲,或稱為「閃避」現象。 本文件說明可用以測量 UI 效能的工具,以及呈現可將 UI 效能測量與測試做法整合的方法。
為改善效能,首先您需要測量系統效能的能力,接著在管道的各部分發生問題時加以診斷和辨識。
dumpsys 是一種 Android 工具,可在裝置上執行和傾印有關系統服務狀態的有趣資訊。 將 gfxinfo 命令傳送至 dumpsys,會將錄製階段所發生與動畫的畫面相關的效能資訊以 logcat 提供輸出。
> adb shell dumpsys gfxinfo <PACKAGE_NAME>
此命令會產生多種不同的畫面計時資料。
使用 M 預覽版,命令會在程序的生命週期全程收集畫面資料,並將彙總的分析列印到 logcat。 例如:
Stats since: 752958278148ns Total frames rendered: 82189 Janky frames: 35335 (42.99%) 90th percentile: 34ms 95th percentile: 42ms 99th percentile: 69ms Number Missed Vsync: 4706 Number High input latency: 142 Number Slow UI thread: 17270 Number Slow bitmap uploads: 1542 Number Slow draw: 23342
這些高階統計資料是以高階方式轉換應用程式的轉譯效能,還有其在許多畫面的穩定性。
M 預覽版隨附新的命令 gfxinfo,而 framestats 可從最近的畫面提供相當詳細的畫面計時資訊,讓您可以追蹤並更準確進行除錯。
>adb shell dumpsys gfxinfo <PACKAGE_NAME> framestats
此命令會從應用程式所產生至少 120 個畫面當中,加上奈秒時間戳記印出畫面計時資訊。以下範例是 adb dumpsys gfxinfo <PACKAGE_NAME> framestats 的原始輸出:
0,49762224585003,49762241251670,9223372036854775807,0,49762257627204,49762257646058,49762257969704,49762258002100,49762265541631,49762273951162,49762300914808,49762303675954, 0,49762445152142,49762445152142,9223372036854775807,0,49762446678818,49762446705589,49762447268818,49762447388037,49762453551527,49762457134131,49762474889027,49762476150120, 0,49762462118845,49762462118845,9223372036854775807,0,49762462595381,49762462619287,49762462919964,49762462968454,49762476194547,49762476483454,49762480214964,49762480911527, 0,49762479085548,49762479085548,9223372036854775807,0,49762480066370,49762480099339,49762481013089,49762481085850,49762482232152,49762482478350,49762485657620,49762486116683,
這裡的每一行輸出都代表應用程式產生的一個畫面。每行都有固定的資料欄編號,描述畫面產生管道的各階段所花費的時間。 下一節會詳細說明此格式,包括各資料欄代表的意義。
由於資料區塊是以 CSV 格式輸出,所以可以直接將它貼到選擇的試算表工具,或使用指令碼來收集和剖析。 下表說明輸出資料欄的格式。 所有時間戳記都以奈秒為單位。
您能以不同的方式使用這項資料。顯示不同延遲貯體中畫面時間分布的長條圖就是一種簡單但實用的方式,請見下圖。 本圖可一目瞭然地告訴我們,大部分畫面都低於 16ms 的上限 (紅色除外),但只有幾個畫面明顯超過上限。 我們可以查看此長條圖一段時間的變化,觀察出現的大規模位移或產生新的極端值。 您也能根據資料中的許多時間戳記將輸入延遲、花費在版面配置的時間或其他類似的有趣度量指標繪成圖表。
如果 [開發人員選項] 中的 [設定檔 GPU 轉譯] 設定為 [In adb shell dumpsys gfxinfo]
,adb shell dumpsys gfxinfo
命令會印出最近 120 個畫面的計時資訊,以定位鍵分隔值分成數個不同類別。
這項資料非常適合用來指出可能是繪製管道的哪個部分太慢。
類似於上述的 framestats,可以直接將它貼到選擇的試算表工具,或使用指令碼來收集和剖析。 下圖顯示許多由應用程式產生的畫面花費時間的分類細項。
執行 gfxinfo、複製輸出、將輸出貼入試算表應用程式,然後將資料繪製成堆疊長條圖的結果。
每個直條都代表動畫的一個畫面,其高度代表計算該畫面所花費的毫秒數。 長條的每個色塊都代表轉譯管道的不同階段,好讓您看出應用程式的哪部分可能產生瓶頸。 如需瞭解繪製管道以及如何最佳化的詳細資訊,請參閱硬體加速或無效判定、版面配置及效能影片。
framestats 與簡單的畫面計時都會收集極短時間內的資料 – 轉譯約需兩秒。 為了精確控制這段時間,例如只限特定動畫的資料,您可以重設所有計數器,然後彙總收集的統計資料。
>adb shell dumpsys gfxinfo <PACKAGE_NAME> reset
這也能和傾印命令本身結合使用,定期收集和重設,持續擷取兩秒時間內的畫面。
識別回復是追蹤問題和維護應用程式健康情況的第一步。 不過,dumpsys 只能識別有問題存在與相關的嚴重性。 您仍需要診斷造成效能問題的特定原因,以及找出適當的修正方式。 因此,強烈建議您使用 systrace 工具。
如需 Android 的轉譯管道如何運作、常見問題以及如何修正的詳細資訊,下列的一些資訊可能會很實用:
UI 效能測試的方法之一就是讓測試人員對目標應用程式執行一組使用者操作,並以肉眼查看,或花費很長一段時間使用工具導向的方法,尋找閃避現象。 但這種靠人工的方式充滿危險,人類對畫面率變化的感知能力因人而異,而且這種方法也很費時、繁瑣且容易出錯。
較有效率的方法是從自動化的 UI 測試中記錄和分析重要效能度量指標。 Android M 開發人員預覽版包含新的記錄功能,能夠輕鬆判斷應用程式動畫中閃避現象的數量與嚴重程度,還能用來建置嚴謹的程序,判斷目前的效能並追蹤未來的效能目標。
本文會逐步說明建議用來使用資料以自動化效能測試的方法。
這種方法大多分成兩個主要動作。首先,識別您要測試的項目,以及測試的方法。其次是設定和維護自動化測試環境。
在您開始進行自動化測試之前,務必要決定幾個高階決策,才能適當瞭解您的測試空間與可能會有的需求。
請記住,流暢的動畫有所中斷時,就是使用者最容易看見效能低落的時候。 因此,識別要測試哪種類型的 UI 動作時,最好著重在使用者最常看見或對他們的體驗最重要的主要動畫。 例如,以下是一些可能有利於識別的常見情況:
和您團隊的工程人員、設計師及產品經理合作,優先考慮將這些主要產品動畫放入測試涵蓋範圍內。
從高階觀點來看,重要的是識別特定的效能目標,並著重在撰寫測試及收集相關資料。 例如:
在上述的這些情況中,您會想要有歷史追蹤功能,來顯示不同應用程式版本間的效能。
應用程式效能會因其執行所在裝置而異。有些裝置包含的記憶體較少、GPU 較不強大或 CPU 晶片速度較慢。 這表示可在某組硬體上執行良好的動畫,在其他組合上不一定能執行良好,更糟的是可能會在管道的不同部分產生瓶頸。 使用者所見可能會不同,為將這點列入考量,請挑選涵蓋當前高階裝置、低階裝置、平板電腦等的一系列裝置執行測試。 尋找 CPU 效能、RAM、畫面密度、大小等方面的變化。 高階裝置上通過的測試,在低階裝置上可能會失敗。
工具套件 (例如 UI Automator 和 Espresso) 是為協助將使用者在您的應用程式四處移動的動作自動化而建置。 這些都是模擬使用者與裝置互動的簡單架構。 如要使用這些架構,您要有效地建立會逐一執行一組使用者動作的獨特指令碼,然後在裝置上自行播放。
連同 dumpsys gfxinfo
,再結合這些自動化測試,您可快速建立可重現系統,讓您執行測試並測量該特定情況下的效能資訊。
在您能夠執行 UI 測試,還有可從單一測試收集資料的管道後,下一個重要步驟是利用可多次執行該項測試的架構,然後彙總產生的效能資料,以供您的開發團隊進一步分析。
直接在目標裝置/模擬器上執行的 UI 測試架構 (例如 UI Automator) 毫無價值。 因為效能收集資訊是由主控機器透過 ADB 傳送命令驅動 dumpsys gfxinfo 來完成。 MonkeyRunner 架構是為了協助橋接這些個別實體開發。在主控機器上執行的指令碼處理系統可對一組連接的裝置發出命令,也能接收來自這些裝置的資料。
建置一組指令碼以適當自動化 UI 效能測試,至少應能利用 monkeyRunner 來完成下列工作:
在辨識出問題模式與回復之後,下一個步驟是辨識和套用修正。 如果您的自動化測試架構會為畫面保留精確的計時分類細項,可幫助您詳細審察目前可疑的程式碼/版面配置變化 (在回復的情況下),或在您切換為靠人工探究時縮小要分析的系統部分。 如需靠人工探究時,systrace 是開始進行的好地方,顯示轉譯管道各階段、系統中每個執行緒與核心,還有您所定義任何自訂事件標記的精確計時資訊。
請務必注意,從轉譯效能中取得和測量計時的困難度。 這些數字不具決定性且通常受系統狀態、可用記憶體數目、溫度調節,還有上次太陽閃焰何時衝擊您所在地區影響。 重點是您執行相同的測試兩次,而每次得到的數字都有些微不同,數字很接近但不會完全相同。
以這種方式適當收集和分析資料,表示執行相同的測試多次,並累積結果取平均值或中間值。(為了簡單起見,我們稱之為「批次」) 這可讓您粗略計算測試的效能,而不需要精確的計時。
在變更的程式碼之間使用批次,可看出那些變更對效能的影響。 如果前次變更批次的平均畫面率大於後來變更批次,您通常會有那項特定變更的整體 win wrt 效能。
這表示您執行的任何自動化 UI 測試都應將此概念列入考量,同時考量可能會在測試期間發生的任何異常情況。 例如,您的應用程式效能若因為某些裝置問題而突然下降 (並非由您的應用程式引起),您可能會想要重新執行批次,以讓取得的計時較不混亂。
應該執行多少次測試才能獲得有意義的測量結果呢?最少應執行 10 次,若執行更多次 (像是 50 或 100 次) 可以產生更準確的結果 (當然您現在是以時間換取準確度)。