翻譯首頁html
當咱們說到移動開發,性能對用戶體驗是極其重要的。用戶但願應用程序的滾動是平滑的,動畫是有意義的,程序沒有卡頓和被跳過的幀,這被稱做「jank.」 (什麼東西?可是原文是這個)。咱們如何確保咱們的應用程序在各類設備上都不受任何影響?chrome
這裏有兩條選擇:json
在本文裏,咱們將會學習到當執行一個特定的任務的時候如何編寫記錄性能時間線的測試,而且將結果摘要記錄到本地文件。api
步驟:瀏覽器
在本文裏,咱們將會記錄一個列表應用程序的性能。爲了聚焦在性能分析上,本文代碼基於 Scrolling in integration tests 這篇文章。bash
請根據本文講解建立一個應用程序,一個可測試的應用程序,而且編寫測試代碼去驗證一切是否按預期工做。app
下一步,咱們須要記錄應用程序在滾動時候的性能。爲了完成這個任務,咱們可使用FlutterDriver
提供的traceAction
方法。async
此方法運行傳入的函數參數並記錄Timeline
,其中包含有關應用程序性能的詳細信息。在這個例子裏,咱們提供了一個函數去滾動列表,確保一個特定的 item 被顯示。當這個函數完成之後,這個traceAction
方法返回一個Timeline
。編輯器
// Record a performance timeline as we scroll through the list of items
final timeline = await driver.traceAction(() async {
await driver.scrollUntilVisible(
listFinder,
itemFinder,
dyScroll: -300.0,
);
expect(await driver.getText(itemFinder), 'Item 50');
});
複製代碼
如今咱們獲得了一個性能分析時間線,咱們須要一個方法去查看它!這個Timeline
對象提供了發生過的全部事件的詳細信息,可是沒有提供一個方便的方法去查看結果。函數
因此,咱們能夠轉換Timeline
爲TimelineSummary
。這個TimelineSummary
能夠執行兩個任務來讓查看Timeline
結果變的簡單:
Timeline
彙總數據的json文檔。這個彙總包括了跳過的幀的數量,最慢的build時間等信息。Timeline
保存爲json文件存儲到硬盤裏。這個文件能夠用Chrome瀏覽器的chrome://tracing頁面中的跟蹤工具打開。// Convert the Timeline into a TimelineSummary that's easier to read and // understand. final summary = new TimelineSummary.summarize(timeline); // Then, save the summary to disk summary.writeSummaryToFile('scrolling_summary', pretty: true); // Optionally, write the entire timeline to disk in a json format. This // file can be opened in the Chrome browser's tracing tools found by
// navigating to chrome://tracing.
summary.writeTimelineToFile('scrolling_timeline', pretty: true);
複製代碼
在咱們配置咱們的測試去捕獲Timeline
的性能分析結果並編寫將結果保存到硬盤的代碼之後,咱們能夠運行下面的命令來測試:
flutter drive --target=test_driver/app.dart
複製代碼
在測試完成之後,項目根目錄的build
文件夾下面會生成兩個文件:
scrolling_summary.timeline_summary.json
包含總結摘要。能夠用任意文本編輯器打開該文件以查看其中的信息。經過更高級的設置,咱們能夠保存每次測試運行的總結摘要而且能夠將這些結果作成圖表。scrolling_timeline.timeline.json
包含完成的timeline數據。 用Chrome瀏覽器的chrome://tracing頁面中的跟蹤工具打開該文件。這個追蹤工具提供了一個方便的界面來分析timeline數據,該工具能夠找到性能問題的源頭。{
"average_frame_build_time_millis": 4.2592592592592595,
"worst_frame_build_time_millis": 21.0,
"missed_frame_build_budget_count": 2,
"average_frame_rasterizer_time_millis": 5.518518518518518,
"worst_frame_rasterizer_time_millis": 51.0,
"missed_frame_rasterizer_budget_count": 10,
"frame_count": 54,
"frame_build_times": [
6874,
5019,
3638
],
"frame_rasterizer_times": [
51955,
8468,
3129
]
}
複製代碼
import 'package:flutter_driver/flutter_driver.dart';
import 'package:test/test.dart';
void main() {
group('Scrollable App', () {
FlutterDriver driver;
setUpAll(() async {
driver = await FlutterDriver.connect();
});
tearDownAll(() async {
if (driver != null) {
driver.close();
}
});
test('verifies the list contains a specific item', () async {
final listFinder = find.byValueKey('long_list');
final itemFinder = find.byValueKey('item_50_text');
// Record a performance profile as we scroll through the list of items
final timeline = await driver.traceAction(() async {
await driver.scrollUntilVisible(
listFinder,
itemFinder,
dyScroll: -300.0,
);
expect(await driver.getText(itemFinder), 'Item 50');
});
// Convert the Timeline into a TimelineSummary that's easier to read and // understand. final summary = new TimelineSummary.summarize(timeline); // Then, save the summary to disk summary.writeSummaryToFile('scrolling_summary', pretty: true); // Optionally, write the entire timeline to disk in a json format. This // file can be opened in the Chrome browser's tracing tools found by
// navigating to chrome://tracing.
summary.writeTimelineToFile('scrolling_timeline', pretty: true);
});
});
}
複製代碼