公告

👇欢迎大家关注公众号&私信交流👇

Skip to content

Flutter 性能测试详解

简介

性能测试用于评估应用的性能表现。本文介绍如何在 Flutter 中进行性能测试。

基本配置

添加依赖

yaml
dev_dependencies:
  flutter_test:
    sdk: flutter
  flutter_driver:
    sdk: flutter
  test: ^1.24.1

创建测试文件

dart
// test_driver/app.dart
import 'package:flutter_driver/driver_extension.dart';
import 'package:my_app/main.dart' as app;

void main() {
  enableFlutterDriverExtension();
  app.main();
}

// test_driver/app_test.dart
import 'package:flutter_driver/flutter_driver.dart';
import 'package:test/test.dart';

void main() {
  group('Performance Tests', () {
    late FlutterDriver driver;

    setUpAll(() async {
      driver = await FlutterDriver.connect();
    });

    tearDownAll(() async {
      await driver.close();
    });

    // 测试用例
  });
}

测试方法

1. 启动时间测试

dart
test('Measure app startup time', () async {
  final timeline = await driver.traceAction(() async {
    await driver.waitUntilFirstFrameRasterized();
  });
  
  final summary = TimelineSummary.summarize(timeline);
  print('Startup time: ${summary.frameBuildTime}ms');
});

2. 滚动性能测试

dart
test('Measure scroll performance', () async {
  // 定位滚动列表
  final listFinder = find.byType('ListView');
  
  final timeline = await driver.traceAction(() async {
    // 执行滚动操作
    await driver.scroll(
      listFinder,
      0,
      -300,
      Duration(milliseconds: 500),
    );
  });
  
  final summary = TimelineSummary.summarize(timeline);
  print('Average frame build time: ${summary.averageFrameBuildTime}ms');
  print('Worst frame build time: ${summary.worstFrameBuildTime}ms');
  print('Frame count: ${summary.frameCount}');
});

完整示例

dart
void main() {
  group('Performance Tests', () {
    late FlutterDriver driver;
    
    setUpAll(() async {
      driver = await FlutterDriver.connect();
      
      // 等待应用稳定
      await driver.waitUntilFirstFrameRasterized();
    });
    
    tearDownAll(() async {
      await driver.close();
    });
    
    test('Measure app startup performance', () async {
      final timeline = await driver.traceAction(() async {
        await driver.waitFor(find.text('Welcome'));
      });
      
      final summary = TimelineSummary.summarize(timeline);
      
      // 输出性能数据
      print('===== App Startup Performance =====');
      print('Frame build time: ${summary.frameBuildTime}ms');
      print('Frame rasterizer time: ${summary.frameRasterizerTime}ms');
      
      // 保存跟踪文件
      await summary.writeTimelineToFile(
        'startup_timeline',
        pretty: true,
      );
    });
    
    test('Measure scrolling performance', () async {
      // 等待列表加载
      await driver.waitFor(find.byType('ListView'));
      
      final timeline = await driver.traceAction(() async {
        // 执行多次滚动
        for (var i = 0; i < 5; i++) {
          await driver.scroll(
            find.byType('ListView'),
            0,
            -300,
            Duration(milliseconds: 500),
          );
          
          await Future.delayed(Duration(milliseconds: 500));
        }
      });
      
      final summary = TimelineSummary.summarize(timeline);
      
      print('===== Scrolling Performance =====');
      print('Average frame build time: ${summary.averageFrameBuildTime}ms');
      print('90th percentile frame build time: '
          '${summary.computePercentileFrameBuildTime(90.0)}ms');
      print('Worst frame build time: ${summary.worstFrameBuildTime}ms');
      print('Frame count: ${summary.frameCount}');
      print('Frame build time histogram: ${summary.buildTimeHistogram}');
      
      // 保存跟踪文件
      await summary.writeTimelineToFile(
        'scrolling_timeline',
        pretty: true,
      );
    });
    
    test('Measure memory usage', () async {
      final memory = await driver.getVMStatistics();
      
      print('===== Memory Usage =====');
      print('Used heap size: ${memory['heapUsed']} bytes');
      print('Total heap size: ${memory['heapTotal']} bytes');
      print('External memory: ${memory['external']} bytes');
    });
  });
}

性能指标

1. 时间指标

  • 启动时间
  • 页面加载时间
  • 动画帧时间
  • 响应时间

2. 内存指标

  • 内存使用量
  • 内存泄漏
  • GC 频率

3. CPU 指标

  • CPU 使用率
  • 热点函数
  • 线程使用情况

性能分析工具

1. DevTools

dart
// 启用 DevTools 性能叠加层
void main() {
  if (kDebugMode) {
    debugPaintSizeEnabled = true;
    debugPrintMarkNeedsLayoutStacks = true;
    debugPrintMarkNeedsPaintStacks = true;
  }
  runApp(MyApp());
}

2. Performance Overlay

dart
MaterialApp(
  showPerformanceOverlay: true,
  home: MyHomePage(),
)

最佳实践

  1. 设置性能基准
  2. 定期运行测试
  3. 监控关键指标
  4. 分析性能瓶颈
  5. 持续优化改进

注意事项

  1. 测试环境配置
  2. 数据采样方法
  3. 测试稳定性
  4. 性能阈值设置
  5. 结果分析方法

总结

性能测试是保证应用性能的重要手段。通过合理的性能测试和监控,可以及时发现和解决性能问题,提供更好的用户体验。