首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Flutter应用性能监控的三种关键指标统计方法

Flutter应用性能监控的三种关键指标统计方法

作者头像
贺公子之数据科学与艺术
发布2025-12-18 09:42:08
发布2025-12-18 09:42:08
1040
举报
页面异常率统计方法

页面异常率反映了页面渲染过程中出现异常的概率,计算公式为:页面异常率 = 异常发生次数 / 整体页面PV数

异常发生次数统计 通过全局变量 exceptionCount 在异常捕获回调中累加异常次数:

代码语言:javascript
复制
int exceptionCount = 0; 
Future<Null> _reportError(dynamic error, dynamic stackTrace) async {
  exceptionCount++; //累加异常次数
  FlutterCrashPlugin.postException(error, stackTrace);
}

整体页面PV数统计 通过 NavigatorObserver 监听页面打开行为,累加PV数:

代码语言:javascript
复制
int totalPV = 0;
class MyObserver extends NavigatorObserver{
  @override
  void didPush(Route route, Route previousRoute) {
    super.didPush(route, previousRoute);
    totalPV++; //累加PV
  }
}

计算页面异常率

代码语言:javascript
复制
double pageException() {
  if(totalPV == 0) return 0;
  return exceptionCount/totalPV;
}

页面帧率(FPS)计算方法

FPS反映页面渲染流畅度,推荐值为60Hz。计算需结合VSync信号周期(16.67毫秒)。

帧绘制时间采集 注册 window.onReportTimings 回调,保留最近25帧数据:

代码语言:javascript
复制
const maxframes = 25;
final lastFrames = List<FrameTiming>();
const frameInterval = Duration(microseconds: Duration.microsecondsPerSecond ~/ 60);

void onReportTimings(List<FrameTiming> timings) {
  lastFrames.addAll(timings);
  if(lastFrames.length > maxframes) {
    lastFrames.removeRange(0, lastFrames.length - maxframes);
  }
}

FPS计算公式

\text{FPS} = 60 \times \frac{\text{实际渲染帧数}}{\text{理论应渲染帧数}}

其中理论应渲染帧数为每帧耗时除以VSync周期后向上取整的总和。

实现代码

代码语言:javascript
复制
double get fps {
  int sum = 0;
  for (FrameTiming timing in lastFrames) {
    int duration = timing.timestampInMicroseconds(FramePhase.rasterFinish) - 
                  timing.timestampInMicroseconds(FramePhase.buildStart);
    sum += (duration / frameInterval.inMicroseconds).ceil();
  }
  return lastFrames.isEmpty ? 60 : 60 * lastFrames.length / sum;
}

页面加载时长统计

页面加载时长反映从页面触发渲染到首帧完成的时间,可通过以下方式采集:

关键时间点记录

  1. 页面跳转时记录起始时间戳。
  2. WidgetsBinding 的首次帧回调中记录结束时间。

代码实现

代码语言:javascript
复制
DateTime _pageStartTime;

void _startPageLoad() {
  _pageStartTime = DateTime.now();
}

void _endPageLoad() {
  final loadTime = DateTime.now().difference(_pageStartTime).inMilliseconds;
  debugPrint('Page load time: $loadTime ms');
}

// 在页面初始化时调用_startPageLoad
// 在首帧回调中调用_endPageLoad
WidgetsBinding.instance.addPostFrameCallback((_) {
  _endPageLoad();
});

优化建议

  • 确保时间戳记录覆盖所有关键路径(如网络请求、布局计算)。
  • 对异步操作需通过 Future 链式追踪总耗时。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-12-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 页面异常率统计方法
  • 页面帧率(FPS)计算方法
  • 页面加载时长统计
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档