diff --git a/dev/devicelab/lib/framework/utils.dart b/dev/devicelab/lib/framework/utils.dart index 46e579f0d30..3ec8b7dfbfa 100644 --- a/dev/devicelab/lib/framework/utils.dart +++ b/dev/devicelab/lib/framework/utils.dart @@ -237,6 +237,14 @@ Future flutter(String command, canFail: canFail, env: env); } +/// Runs a `flutter` command and returns the standard output as a string. +Future evalFlutter(String command, + {List options: const [], bool canFail: false, Map env}) { + List args = [command]..addAll(options); + return eval(path.join(flutterDirectory.path, 'bin', 'flutter'), args, + canFail: canFail, env: env); +} + String get dartBin => path.join(flutterDirectory.path, 'bin', 'cache', 'dart-sdk', 'bin', 'dart'); diff --git a/dev/devicelab/lib/tasks/perf_tests.dart b/dev/devicelab/lib/tasks/perf_tests.dart index 4c5141c58ad..ace1efff7af 100644 --- a/dev/devicelab/lib/tasks/perf_tests.dart +++ b/dev/devicelab/lib/tasks/perf_tests.dart @@ -164,38 +164,42 @@ class BuildTest { await flutter('packages', options: ['get']); Stopwatch watch = new Stopwatch()..start(); - await flutter('build', options: [ + String buildLog = await evalFlutter('build', options: [ 'aot', + '-v', '--profile', '--no-pub', '--target-platform', 'android-arm' // Generate blobs instead of assembly. ]); watch.stop(); - int vmisolateSize = file("$testDirectory/build/aot/snapshot_aot_vmisolate").lengthSync(); - int isolateSize = file("$testDirectory/build/aot/snapshot_aot_isolate").lengthSync(); - int instructionsSize = file("$testDirectory/build/aot/snapshot_aot_instr").lengthSync(); - int rodataSize = file("$testDirectory/build/aot/snapshot_aot_rodata").lengthSync(); - int totalSize = vmisolateSize + isolateSize + instructionsSize + rodataSize; + RegExp metricExpression = new RegExp(r'([a-zA-Z]+)\(CodeSize\)\: (\d+)'); - Map data = { - 'aot_snapshot_build_millis': watch.elapsedMilliseconds, - 'aot_snapshot_size_vmisolate': vmisolateSize, - 'aot_snapshot_size_isolate': isolateSize, - 'aot_snapshot_size_instructions': instructionsSize, - 'aot_snapshot_size_rodata': rodataSize, - 'aot_snapshot_size_total': totalSize, - }; - return new TaskResult.success(data, benchmarkScoreKeys: [ - 'aot_snapshot_build_millis', - 'aot_snapshot_size_vmisolate', - 'aot_snapshot_size_isolate', - 'aot_snapshot_size_instructions', - 'aot_snapshot_size_rodata', - 'aot_snapshot_size_total', - ]); + Map data = new Map.fromIterable( + metricExpression.allMatches(buildLog), + key: (Match m) => _sdkNameToMetricName(m.group(1)), + value: (Match m) => int.parse(m.group(2)), + ); + data['aot_snapshot_build_millis'] = watch.elapsedMilliseconds; + + return new TaskResult.success(data, benchmarkScoreKeys: data.keys.toList()); }); } + + static String _sdkNameToMetricName(String sdkName) { + const Map kSdkNameToMetricNameMapping = const { + 'VMIsolate': 'aot_snapshot_size_vmisolate', + 'Isolate': 'aot_snapshot_size_isolate', + 'ReadOnlyData': 'aot_snapshot_size_rodata', + 'Instructions': 'aot_snapshot_size_instructions', + 'Total': 'aot_snapshot_size_total', + }; + + if (!kSdkNameToMetricNameMapping.containsKey(sdkName)) + throw 'Unrecognized SDK snapshot metric name: $sdkName'; + + return kSdkNameToMetricNameMapping[sdkName]; + } } /// Measure application memory usage. diff --git a/packages/flutter_tools/lib/src/commands/build_aot.dart b/packages/flutter_tools/lib/src/commands/build_aot.dart index 0d90ef39e34..95586d60861 100644 --- a/packages/flutter_tools/lib/src/commands/build_aot.dart +++ b/packages/flutter_tools/lib/src/commands/build_aot.dart @@ -215,6 +215,7 @@ Future _buildAotSnapshot( '--url_mapping=dart:ui,$uiPath', '--url_mapping=dart:jni,$jniPath', '--url_mapping=dart:vmservice_sky,$vmServicePath', + '--print_snapshot_sizes', ]; if (!interpreter) {