精选文章

Flutter 性能监测

2021-08-03 · 性能

性能优化的第一步不是“改代码”,而是可观测。没有监测,就没有诊断。本文给出一套可直接复用的 Flutter 性能监测范式。

1. 监测目标:先定指标

常见指标:

  • 启动耗时(冷启动/首帧)
  • 帧率(FPS)
  • 卡顿(Jank)
  • 页面切换耗时

指标明确后,才能合理埋点。

2. 启动耗时监测

用 Stopwatch 记录关键节点:

class StartupTracker {
  final Stopwatch _watch = Stopwatch()..start();

  void mark(String label) {
    final ms = _watch.elapsedMilliseconds;
    Log.d('startup', '$label ${ms}ms');
  }
}

mark 放在:

  • 初始化开始
  • runApp
  • 首帧完成(WidgetsBinding.instance.addPostFrameCallback

3. FPS 与卡顿监测

SchedulerBinding 监听帧时间:

class FrameMonitor {
  void start() {
    SchedulerBinding.instance.addTimingsCallback((timings) {
      for (final t in timings) {
        final build = t.buildDuration.inMilliseconds;
        final raster = t.rasterDuration.inMilliseconds;
        if (build > 16 || raster > 16) {
          Log.w('jank', 'build=$build raster=$raster');
        }
      }
    });
  }
}

这能捕捉卡顿帧,并记录原因倾向(build vs raster)。

4. 页面切换耗时

结合 RouteObserver 统计:

class RoutePerfObserver extends RouteObserver<PageRoute<dynamic>> {
  final Map<String, Stopwatch> _timers = {};

  @override
  void didPush(Route route, Route? previousRoute) {
    _timers[route.settings.name ?? 'unknown'] = Stopwatch()..start();
  }

  @override
  void didStopUserGesture() {
    _timers.forEach((name, sw) {
      Log.d('route', '$name cost ${sw.elapsedMilliseconds}ms');
    });
  }
}

5. 线上可观测:日志 + 上报

监测不落地就没有意义,建议:

  • 本地日志:开发阶段快速定位
  • 线上上报:聚合分析与趋势判断

上报内容:

  • 启动耗时
  • 卡顿频次
  • 页面切换耗时

6. 监测清单

  • 启动耗时埋点
  • 帧率与卡顿监测
  • 页面切换耗时
  • 线上上报

总结

性能监测是优化的前置条件。只有把数据采集体系建立起来,性能问题才能从“体验”变成“指标”。

JJ

作者简介

专注于内容创作、产品策略与设计实践。欢迎交流合作。

上一篇 下一篇