Force GC before GC-sensitive benchmark runs (#23289)
diff --git a/dev/benchmarks/complex_layout/test_driver/scroll_perf_test.dart b/dev/benchmarks/complex_layout/test_driver/scroll_perf_test.dart
index 39f3438..c85fbd3 100644
--- a/dev/benchmarks/complex_layout/test_driver/scroll_perf_test.dart
+++ b/dev/benchmarks/complex_layout/test_driver/scroll_perf_test.dart
@@ -26,6 +26,9 @@
// benchmark has greater noise.
// See: https://github.com/flutter/flutter/issues/19434
await Future<void>.delayed(const Duration(milliseconds: 250));
+
+ await driver.forceGC();
+
final Timeline timeline = await driver.traceAction(() async {
// Find the scrollable stock list
final SerializableFinder list = find.byValueKey(listKey);
diff --git a/dev/benchmarks/complex_layout/test_driver/semantics_perf_test.dart b/dev/benchmarks/complex_layout/test_driver/semantics_perf_test.dart
index dd2023b..372a23d 100644
--- a/dev/benchmarks/complex_layout/test_driver/semantics_perf_test.dart
+++ b/dev/benchmarks/complex_layout/test_driver/semantics_perf_test.dart
@@ -27,6 +27,8 @@
// Let app become fully idle.
await Future<void>.delayed(const Duration(seconds: 2));
+ await driver.forceGC();
+
final Timeline timeline = await driver.traceAction(() async {
expect(await driver.setSemantics(true), isTrue);
});
diff --git a/packages/flutter_driver/lib/src/driver/driver.dart b/packages/flutter_driver/lib/src/driver/driver.dart
index 4037a1a..3dbbc47 100644
--- a/packages/flutter_driver/lib/src/driver/driver.dart
+++ b/packages/flutter_driver/lib/src/driver/driver.dart
@@ -137,6 +137,7 @@
static const String _setVMTimelineFlagsMethodName = '_setVMTimelineFlags';
static const String _getVMTimelineMethodName = '_getVMTimeline';
static const String _clearVMTimelineMethodName = '_clearVMTimeline';
+ static const String _collectAllGarbageMethodName = '_collectAllGarbage';
static int _nextDriverId = 0;
@@ -791,6 +792,22 @@
return result;
}
+ /// Force a garbage collection run in the VM.
+ Future<void> forceGC() async {
+ try {
+ await _peer
+ .sendRequest(_collectAllGarbageMethodName, <String, String>{
+ 'isolateId': 'isolates/${_appIsolate.numberAsString}',
+ });
+ } catch (error, stackTrace) {
+ throw DriverError(
+ 'Failed to force a GC due to remote error',
+ error,
+ stackTrace,
+ );
+ }
+ }
+
/// Closes the underlying connection to the VM service.
///
/// Returns a [Future] that fires once the connection has been closed.