From 9b5c78060408bee6c6a8b08aceb60bdbdba3039d Mon Sep 17 00:00:00 2001 From: Michael Goderbauer Date: Sun, 21 Oct 2018 15:58:19 +0200 Subject: [PATCH] Force GC before GC-sensitive benchmark runs (#23289) --- .../test_driver/scroll_perf_test.dart | 3 +++ .../test_driver/semantics_perf_test.dart | 2 ++ .../flutter_driver/lib/src/driver/driver.dart | 17 +++++++++++++++++ 3 files changed, 22 insertions(+) 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 39f343841b..c85fbd3318 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 @@ void main() { // benchmark has greater noise. // See: https://github.com/flutter/flutter/issues/19434 await Future.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 dd2023b2d9..372a23d3c5 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 @@ void main() { // Let app become fully idle. await Future.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 4037a1a6d6..3dbbc476e3 100644 --- a/packages/flutter_driver/lib/src/driver/driver.dart +++ b/packages/flutter_driver/lib/src/driver/driver.dart @@ -137,6 +137,7 @@ class FlutterDriver { 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 @@ class FlutterDriver { return result; } + /// Force a garbage collection run in the VM. + Future forceGC() async { + try { + await _peer + .sendRequest(_collectAllGarbageMethodName, { + '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.