| // 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(_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 = 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; |
| } |