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.