diff --git a/dev/devicelab/lib/tasks/gallery.dart b/dev/devicelab/lib/tasks/gallery.dart index 887d960d3f..f9ae9a058c 100644 --- a/dev/devicelab/lib/tasks/gallery.dart +++ b/dev/devicelab/lib/tasks/gallery.dart @@ -189,6 +189,7 @@ class GalleryTransitionTest { '90th_percentile_frame_build_time_millis', '99th_percentile_frame_build_time_millis', 'average_frame_rasterizer_time_millis', + 'stddev_frame_rasterizer_time_millis', 'worst_frame_rasterizer_time_millis', '90th_percentile_frame_rasterizer_time_millis', '99th_percentile_frame_rasterizer_time_millis', diff --git a/packages/flutter_driver/lib/src/driver/timeline_summary.dart b/packages/flutter_driver/lib/src/driver/timeline_summary.dart index cd7451c299..ac36850f45 100644 --- a/packages/flutter_driver/lib/src/driver/timeline_summary.dart +++ b/packages/flutter_driver/lib/src/driver/timeline_summary.dart @@ -82,6 +82,20 @@ class TimelineSummary { return _averageInMillis(_extractGpuRasterizerDrawDurations()); } + /// Standard deviation amount of time spent per frame in the engine rasterizer. + /// + /// Throws a [StateError] if this summary contains no timeline events. + double computeStandardDeviationFrameRasterizerTimeMillis() { + final List durations = _extractGpuRasterizerDrawDurations(); + final double average = _averageInMillis(durations); + double tally = 0.0; + for (final Duration duration in durations) { + final double time = duration.inMicroseconds.toDouble() / 1000.0; + tally += (average - time).abs(); + } + return tally / durations.length; + } + /// The longest frame rasterization time in milliseconds. /// /// Throws a [StateError] if this summary contains no timeline events. @@ -146,6 +160,9 @@ class TimelineSummary { /// * "average_frame_rasterizer_time_millis": Average amount of time spent /// per frame in the engine rasterizer. /// See [computeAverageFrameRasterizerTimeMillis]. + /// * "stddev_frame_rasterizer_time_millis": Standard deviation of the amount + /// of time spent per frame in the engine rasterizer. + /// See [computeStandardDeviationFrameRasterizerTimeMillis]. /// * "90th_percentile_frame_rasterizer_time_millis" and /// "99th_percentile_frame_rasterizer_time_millis": The 90/99-th percentile /// frame rasterization time in milliseconds. @@ -240,6 +257,7 @@ class TimelineSummary { 'worst_frame_build_time_millis': computeWorstFrameBuildTimeMillis(), 'missed_frame_build_budget_count': computeMissedFrameBuildBudgetCount(), 'average_frame_rasterizer_time_millis': computeAverageFrameRasterizerTimeMillis(), + 'stddev_frame_rasterizer_time_millis': computeStandardDeviationFrameRasterizerTimeMillis(), '90th_percentile_frame_rasterizer_time_millis': computePercentileFrameRasterizerTimeMillis(90.0), '99th_percentile_frame_rasterizer_time_millis': computePercentileFrameRasterizerTimeMillis(99.0), 'worst_frame_rasterizer_time_millis': computeWorstFrameRasterizerTimeMillis(), diff --git a/packages/flutter_driver/test/src/real_tests/timeline_summary_test.dart b/packages/flutter_driver/test/src/real_tests/timeline_summary_test.dart index b94249191e..430df503df 100644 --- a/packages/flutter_driver/test/src/real_tests/timeline_summary_test.dart +++ b/packages/flutter_driver/test/src/real_tests/timeline_summary_test.dart @@ -463,6 +463,7 @@ void main() { 'worst_frame_build_time_millis': 19.0, 'missed_frame_build_budget_count': 2, 'average_frame_rasterizer_time_millis': 16.0, + 'stddev_frame_rasterizer_time_millis': 4.0, '90th_percentile_frame_rasterizer_time_millis': 20.0, '99th_percentile_frame_rasterizer_time_millis': 20.0, 'worst_frame_rasterizer_time_millis': 20.0, @@ -578,6 +579,7 @@ void main() { '99th_percentile_frame_build_time_millis': 19.0, 'missed_frame_build_budget_count': 2, 'average_frame_rasterizer_time_millis': 16.0, + 'stddev_frame_rasterizer_time_millis': 4.0, '90th_percentile_frame_rasterizer_time_millis': 20.0, '99th_percentile_frame_rasterizer_time_millis': 20.0, 'worst_frame_rasterizer_time_millis': 20.0,