build_benchmarks.dart 2.94 KB
Newer Older
Ian Hickson's avatar
Ian Hickson committed
1
// Copyright 2014 The Flutter Authors. All rights reserved.
2 3 4 5 6 7 8 9 10 11 12
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'dart:io';

import 'package:flutter_devicelab/framework/framework.dart';
import 'package:flutter_devicelab/framework/utils.dart';
import 'package:path/path.dart' as path;

final Directory helloWorldDir = dir(path.join(flutterDirectory.path, 'examples', 'hello_world'));

13 14
/// Creates a devicelab build benchmark for Android.
TaskFunction createAndroidBuildBenchmarkTask() {
15
  return () async {
16
    return createBuildCommand('apk');
17 18
  };
}
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83

/// Creates a devicelab build benchmark for iOS.
TaskFunction createIosBuildBenchmarkTask() {
  return () async {
    return createBuildCommand('ios');
  };
}

Future<TaskResult> createBuildCommand(String buildKind) {
  return inDirectory<TaskResult>(helloWorldDir, () async {
    final Stopwatch stopwatch = Stopwatch()
      ..start();
    final Process initialBuild = await startProcess(
      path.join(flutterDirectory.path, 'bin', 'flutter'),
      <String>['build', buildKind, '--debug'],
      environment: null,
    );
    int exitCode = await initialBuild.exitCode;
    if (exitCode != 0) {
      return TaskResult.failure('Failed to build debug app');
    }
    final int initialBuildMilliseconds = stopwatch.elapsedMilliseconds;
    stopwatch
      ..reset()
      ..start();
    final Process secondBuild = await startProcess(
      path.join(flutterDirectory.path, 'bin', 'flutter'),
      <String>['build', buildKind, '--debug'],
      environment: null,
    );
    exitCode = await secondBuild.exitCode;
    if (exitCode != 0) {
      return TaskResult.failure('Failed to build debug app');
    }
    final int secondBuildMilliseconds = stopwatch.elapsedMilliseconds;
    final Process newBuildConfig = await startProcess(
      path.join(flutterDirectory.path, 'bin', 'flutter'),
      <String>['build', buildKind, '--profile'],
      environment: null,
    );
    exitCode = await newBuildConfig.exitCode;
    if (exitCode != 0) {
      return TaskResult.failure('Failed to build profile app');
    }
    stopwatch
      ..reset()
      ..start();
    final Process thirdBuild = await startProcess(
      path.join(flutterDirectory.path, 'bin', 'flutter'),
      <String>['build', buildKind, '--debug'],
      environment: null,
    );
    exitCode = await thirdBuild.exitCode;
    if (exitCode != 0) {
      return TaskResult.failure('Failed to build debug app');
    }
    final int thirdBuildMilliseconds = stopwatch.elapsedMilliseconds;
    stopwatch.stop();
    final Map<String, double> allResults = <String, double>{};
    allResults['first_build_debug_millis'] = initialBuildMilliseconds.toDouble();
    allResults['second_build_debug_millis'] = secondBuildMilliseconds.toDouble();
    allResults['after_config_change_build_debug_millis'] = thirdBuildMilliseconds.toDouble();
    return TaskResult.success(allResults, benchmarkScoreKeys: allResults.keys.toList());
  });
}