Unverified Commit e6920662 authored by Kaushik Iska's avatar Kaushik Iska Committed by GitHub

Add a test to exercise multiple async microtasks in frame workload (#79163)

parent 4a2ff649
...@@ -20,6 +20,7 @@ const String kMultiWidgetConstructionRouteName = '/multi_widget_construction'; ...@@ -20,6 +20,7 @@ const String kMultiWidgetConstructionRouteName = '/multi_widget_construction';
const String kHeavyGridViewRouteName = '/heavy_gridview'; const String kHeavyGridViewRouteName = '/heavy_gridview';
const String kSimpleScrollRouteName = '/simple_scroll'; const String kSimpleScrollRouteName = '/simple_scroll';
const String kStackSizeRouteName = '/stack_size'; const String kStackSizeRouteName = '/stack_size';
const String kAnimationWithMicrotasksRouteName = '/animation_with_microtasks';
const String kScrollableName = '/macrobenchmark_listview'; const String kScrollableName = '/macrobenchmark_listview';
......
...@@ -7,6 +7,7 @@ import 'package:flutter/material.dart'; ...@@ -7,6 +7,7 @@ import 'package:flutter/material.dart';
import 'common.dart'; import 'common.dart';
import 'src/animated_placeholder.dart'; import 'src/animated_placeholder.dart';
import 'src/animation_with_microtasks.dart';
import 'src/backdrop_filter.dart'; import 'src/backdrop_filter.dart';
import 'src/color_filter_and_fade.dart'; import 'src/color_filter_and_fade.dart';
import 'src/cubic_bezier.dart'; import 'src/cubic_bezier.dart';
...@@ -56,6 +57,7 @@ class MacrobenchmarksApp extends StatelessWidget { ...@@ -56,6 +57,7 @@ class MacrobenchmarksApp extends StatelessWidget {
kHeavyGridViewRouteName: (BuildContext context) => const HeavyGridViewPage(), kHeavyGridViewRouteName: (BuildContext context) => const HeavyGridViewPage(),
kSimpleScrollRouteName: (BuildContext context) => const SimpleScroll(), kSimpleScrollRouteName: (BuildContext context) => const SimpleScroll(),
kStackSizeRouteName: (BuildContext context) => const StackSizePage(), kStackSizeRouteName: (BuildContext context) => const StackSizePage(),
kAnimationWithMicrotasksRouteName: (BuildContext context) => const AnimationWithMicrotasks(),
}, },
); );
} }
...@@ -192,6 +194,13 @@ class HomePage extends StatelessWidget { ...@@ -192,6 +194,13 @@ class HomePage extends StatelessWidget {
Navigator.pushNamed(context, kStackSizeRouteName); Navigator.pushNamed(context, kStackSizeRouteName);
}, },
), ),
ElevatedButton(
key: const Key(kAnimationWithMicrotasksRouteName),
child: const Text('Animation With Microtasks'),
onPressed: () {
Navigator.pushNamed(context, kAnimationWithMicrotasksRouteName);
},
),
], ],
), ),
); );
......
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:flutter/material.dart';
class AnimationWithMicrotasks extends StatefulWidget {
const AnimationWithMicrotasks({Key key}) : super(key: key);
@override
_AnimationWithMicrotasksState createState() =>
_AnimationWithMicrotasksState();
}
class _AnimationWithMicrotasksState extends State<AnimationWithMicrotasks> {
final _ChunkedWork work = _ChunkedWork();
@override
void initState() {
super.initState();
work.start();
}
@override
void dispose() {
work.cancel();
super.dispose();
}
@override
Widget build(BuildContext context) {
return const Scaffold(
backgroundColor: Colors.grey,
body: Center(
child: SizedBox(
width: 200,
height: 100,
child: LinearProgressIndicator(),
),
),
);
}
}
class _ChunkedWork {
bool _canceled = false;
Future<void> start() async {
// Run 100 pieces of synchronous work.
// Chunked up to allow frames to be drawn.
for (int i = 0; i < 100; ++i) {
_chunkedSynchronousWork();
}
}
void cancel() {
_canceled = true;
}
Future<void> _chunkedSynchronousWork() async {
while (!_canceled) {
// Yield to the event loop to let engine draw frames.
await Future<void>.delayed(Duration.zero);
// Perform synchronous computation for 1 ms.
_syncComputationFor(const Duration(milliseconds: 1));
}
}
void _syncComputationFor(Duration duration) {
final Stopwatch sw = Stopwatch()..start();
while (!_canceled && sw.elapsed < duration) {}
}
}
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:macrobenchmarks/common.dart';
import 'util.dart';
void main() {
macroPerfTest(
'animation_with_microtasks_perf',
kAnimationWithMicrotasksRouteName,
pageDelay: const Duration(seconds: 1),
duration: const Duration(seconds: 10),
);
}
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:flutter_devicelab/tasks/perf_tests.dart';
import 'package:flutter_devicelab/framework/adb.dart';
import 'package:flutter_devicelab/framework/framework.dart';
Future<void> main() async {
deviceOperatingSystem = DeviceOperatingSystem.ios;
await task(createAnimationWithMicrotasksPerfTest());
}
...@@ -151,6 +151,17 @@ TaskFunction createBackdropFilterPerfTest({bool measureCpuGpu = true}) { ...@@ -151,6 +151,17 @@ TaskFunction createBackdropFilterPerfTest({bool measureCpuGpu = true}) {
).run; ).run;
} }
TaskFunction createAnimationWithMicrotasksPerfTest({bool measureCpuGpu = true}) {
return PerfTest(
'${flutterDirectory.path}/dev/benchmarks/macrobenchmarks',
'test_driver/run_app.dart',
'animation_with_microtasks_perf',
measureCpuGpu: measureCpuGpu,
testDriver: 'test_driver/animation_with_microtasks_perf_test.dart',
saveTraceFile: true,
).run;
}
TaskFunction createBackdropFilterPerfE2ETest() { TaskFunction createBackdropFilterPerfE2ETest() {
return PerfTest.e2e( return PerfTest.e2e(
'${flutterDirectory.path}/dev/benchmarks/macrobenchmarks', '${flutterDirectory.path}/dev/benchmarks/macrobenchmarks',
......
...@@ -942,6 +942,12 @@ ...@@ -942,6 +942,12 @@
"task_name": "mac_tool_integration_tests_3_3", "task_name": "mac_tool_integration_tests_3_3",
"flaky": false "flaky": false
}, },
{
"name": "Mac_ios animation_with_microtasks_perf_ios__timeline_summary",
"repo": "flutter",
"task_name": "mac_ios_animation_with_microtasks_perf_ios__timeline_summary",
"flaky": false
},
{ {
"name": "Mac_ios backdrop_filter_perf_ios__timeline_summary", "name": "Mac_ios backdrop_filter_perf_ios__timeline_summary",
"repo": "flutter", "repo": "flutter",
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment