• Alexander Aprelev's avatar
    Roll engine to b6df7a637498ca9beda1fa9cd7210e3202ea599f. (#15444) · 2f8474f9
    Alexander Aprelev authored
    * Roll engine to b6df7a637498ca9beda1fa9cd7210e3202ea599f.
    
    Changes since last roll:
    ```
    b6df7a637 Roll dart to 290c576264faa096a0b3206c71b2435309d9f904. (#4771)
    a6764dbd5 Add sources for Fuchsia target. (#4763)
    2d5900615 [fuchsia] Remove unused header file. (#4769)
    9717063b7 Revert "Roll dart to c080951d45e79cd25df98036c4be835b284a269c. (#4767)" (#4768)
    9a9814312 Roll dart to c080951d45e79cd25df98036c4be835b284a269c. (#4767)
    e74e8b35c [async] Update includes of async headers to new path (#4760)
    e2c4b2760 Use Dart 2 camel case constants in the engine Dart libraries (#4766)
    9c1e48434 Updates for Fuchsia roll. (#4765)
    14c940e27 Switch from fxl::Mutex to std::mutex (#4764)
    debf82c0b Roll Garnet (#4759)
    5bffdefbb Use weak pointers to the accesibility bridge from objects vended to the UIKit accessibility framework. (#4761)
    ```
    2f8474f9
common.dart 2.69 KB
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'dart:convert' show json;

import 'package:meta/meta.dart';

/// This class knows how to format benchmark results for machine and human
/// consumption.
///

/// Example:
///
///     BenchmarkResultPrinter printer = new BenchmarkResultPrinter();
///     printer.add(
///       description: 'Average frame time',
///       value: averageFrameTime,
///       unit: 'ms',
///       name: 'average_frame_time',
///     );
///     printer.printToStdout();
///
class BenchmarkResultPrinter {

  final List<_BenchmarkResult> _results = <_BenchmarkResult>[];

  /// Adds a benchmark result to the list of results.
  ///
  /// [description] is a human-readable description of the result. [value] is a
  /// result value. [unit] is the unit of measurement, such as "ms", "km", "h".
  /// [name] is a computer-readable name of the result used as a key in the JSON
  /// serialization of the results.
  void addResult({ @required String description, @required double value, @required String unit, @required String name }) {
    _results.add(new _BenchmarkResult(description, value, unit, name));
  }

  /// Prints the results added via [addResult] to standard output, once as JSON
  /// for computer consumption and once formatted as plain text for humans.
  void printToStdout() {
    // IMPORTANT: keep these values in sync with dev/devicelab/bin/tasks/microbenchmarks.dart
    const String jsonStart = '================ RESULTS ================';
    const String jsonEnd = '================ FORMATTED ==============';
    const String jsonPrefix = ':::JSON:::';

    print(jsonStart);
    print('$jsonPrefix ${_printJson()}');
    print(jsonEnd);
    print(_printPlainText());
  }

  String _printJson() {
    final Map<String, double> results = <String, double>{};
    for (_BenchmarkResult result in _results) {
      results[result.name] = result.value;
    }
    return json.encode(results);
  }

  String _printPlainText() {
    final StringBuffer buf = new StringBuffer();
    for (_BenchmarkResult result in _results) {
      buf.writeln('${result.description}: ${result.value.toStringAsFixed(1)} ${result.unit}');
    }
    return buf.toString();
  }
}

class _BenchmarkResult {
  _BenchmarkResult(this.description, this.value, this.unit, this.name);

  /// Human-readable description of the result, e.g. "Average frame time".
  final String description;

  /// Result value that in agreement with [unit].
  final double value;

  /// Unit of measurement that is in agreement with [value].
  final String unit;

  /// Computer-readable name of the result.
  final String name;
}