Flutter性能监控插件performance_timer的使用

发布于 1周前 作者 vueper 来自 Flutter

Flutter性能监控插件performance_timer的使用

Performance Timer是一个用于测量函数和方法调用时间的Flutter插件。它支持嵌套计时器、跟踪每个计时器内部的真实时间和自有时间,并允许将结果打印出来或导出为Trace Event Format,以便使用诸如Google Perfetto等工具进行分析。

特性

  • 使用timer.ownDurationtimer.child来跟踪方法内花费的时间。
  • 使用timer.realDuration跟踪自创建计时器以来的所有时间。
  • 使用timer.setTag存储与每个根计时器关联的额外数据。
  • 使用PerformanceTimerSerializerString打印结果。
  • 使用PerformanceTimerSerializerTraceEvent导出结果到Trace Event Format。

使用示例

创建一个计时器

final timer = PerformanceTimer(name: 'rootTimer', category: 'category', tags: {'key': 'value'});
// 执行一些工作
timer.finish();

创建一个嵌套/子计时器

// 创建一个子计时器,暂停`timer.ownDuration`
final child = timer.child('childTimer');
// 执行一些工作
// ...
// 停止计时器并通知父级恢复`timer.ownDuration`
child.finish();

测量回调

await timer.measure(
  'childTimer',
  () async {
    // 执行一些工作
  },
);

添加标签

timer.setTag('result', '3');

// 如果在子计时器中设置标签,则会在根计时器上设置(在此例中是`timer`)
child.setTag('result', '3');

移除标签

timer.setTag('result');

// 如果在子计时器中移除标签,则会在根计时器上移除(在此例中是`timer`)
child.setTag('result');

序列化结果

const stringSerializer = PerformanceTimerSerializerString();
print(await stringSerializer.serialize(timer));

const traceEventSerializer = PerformanceTimerSerializerTraceEvent();
print(jsonEncode(await traceEventSerializer.serialize(timer)));

完整示例Demo

下面是一个完整的示例代码,展示了如何使用performance_timer包:

import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:performance_timer/performance_timer.dart';

Future<void> main() async {
  final rootTimer = PerformanceTimer(
    name: 'main',
    tags: {
      'externalId': '12345',
    },
    category: 'root',
  );

  // 模拟一些计算延迟
  await Future.delayed(const Duration(milliseconds: 100));

  await calculationA(rootTimer.child('calculationA'));
  await calculationB(rootTimer.child('calculationB'));

  await Future.delayed(const Duration(milliseconds: 100));

  final result = await rootTimer.measure('measure', (child) async {
    await Future.delayed(const Duration(milliseconds: 100));
    return child.measure('data', (_) async => 1);
  });

  print(result);

  rootTimer.finish();

  final stringSerializer = const PerformanceTimerSerializerString();
  print(stringSerializer.serialize(rootTimer));

  final traceEventSerializer = const PerformanceTimerSerializerTraceEvent();
  final serializedTrace = jsonEncode(traceEventSerializer.serialize(rootTimer));
  final file = File('./example_trace.json');
  await file.writeAsString(serializedTrace);
}

Future<void> calculationA(PerformanceTimer timer) async {
  await Future.delayed(const Duration(milliseconds: 200));
  timer.finish();
}

Future<void> calculationB(PerformanceTimer timer) async {
  await Future.delayed(const Duration(milliseconds: 200));
  await calculationB2(timer.child('calculationB2', category: 'B2'));
  timer.finish();
}

Future<void> calculationB2(PerformanceTimer timer) async {
  await Future.delayed(const Duration(milliseconds: 340));
  timer.setTag('result', '3');
  timer.finish();
}

这个示例展示了如何使用performance_timer来监控应用程序中的不同部分,并将结果导出以供进一步分析。通过这种方式,您可以更好地理解应用的性能瓶颈,并采取相应的优化措施。


更多关于Flutter性能监控插件performance_timer的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter性能监控插件performance_timer的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter应用中,性能监控是一个关键方面,它可以帮助开发者识别和优化应用的性能瓶颈。performance_timer 是一个用于性能监控的插件,虽然 Flutter 社区中并没有一个广泛认可的名为 performance_timer 的官方或主流插件,但我们可以创建一个类似的性能计时器来实现这一功能。

下面是一个自定义的性能计时器实现示例,你可以将其集成到你的 Flutter 应用中来进行性能监控。这个示例使用 Dart 的 Stopwatch 类来测量代码块的执行时间。

1. 创建一个性能计时器工具类

首先,我们创建一个工具类 PerformanceTimer 来封装计时功能。

import 'dart:core';

class PerformanceTimer {
  Stopwatch _stopwatch;

  PerformanceTimer() {
    _stopwatch = Stopwatch()..start();
  }

  void reset() {
    _stopwatch.reset();
    _stopwatch.start();
  }

  double elapsedMilliseconds() {
    return _stopwatch.elapsedMilliseconds.toDouble();
  }

  double elapsedMicroseconds() {
    return _stopwatch.elapsedMicroseconds.toDouble();
  }

  void stop() {
    _stopwatch.stop();
  }
}

2. 在 Flutter 应用中使用性能计时器

接下来,我们可以在 Flutter 应用的不同部分使用这个性能计时器来监控性能。

import 'package:flutter/material.dart';
import 'performance_timer.dart'; // 导入我们创建的工具类

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Performance Timer Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  PerformanceTimer _performanceTimer;

  @override
  void initState() {
    super.initState();
    _performanceTimer = PerformanceTimer();
    // 模拟一个耗时的操作
    Future.delayed(Duration(seconds: 2), () {
      print("Elapsed time: ${_performanceTimer.elapsedMilliseconds()} ms");
      _performanceTimer.reset(); // 重置计时器以便下次使用
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Performance Timer Demo'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            _performanceTimer.reset(); // 开始新的计时
            // 模拟另一个耗时的操作
            Future.delayed(Duration(seconds: 1), () {
              print("Button tap elapsed time: ${_performanceTimer.elapsedMilliseconds()} ms");
            });
          },
          child: Text('Tap me'),
        ),
      ),
    );
  }

  @override
  void dispose() {
    _performanceTimer.stop(); // 清理资源
    super.dispose();
  }
}

3. 解释代码

  • PerformanceTimer 类封装了一个 Stopwatch 实例,并提供了开始、重置、获取已用时间和停止计时的方法。
  • MyHomePage 中,我们在 initState 方法中初始化了一个 PerformanceTimer 实例,并使用 Future.delayed 模拟了一个耗时的操作,然后打印出耗时。
  • 我们还在按钮点击事件中重置了计时器,以测量按钮点击操作的耗时。
  • dispose 方法中,我们停止了计时器以避免内存泄漏。

通过这种方式,你可以在 Flutter 应用中的任何地方使用 PerformanceTimer 来监控代码块的执行时间,从而帮助你识别和优化性能瓶颈。

回到顶部