| // Copyright (c) 2016 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:async'; |
| |
| import 'framework.dart'; |
| |
| /// A benchmark harness used to run a benchmark multiple times and report the |
| /// best result. |
| abstract class Benchmark { |
| Benchmark(this.name); |
| |
| final String name; |
| |
| TaskResult bestResult; |
| |
| Future<Null> init() => new Future<Null>.value(); |
| |
| Future<num> run(); |
| TaskResult get lastResult; |
| |
| @override |
| String toString() => name; |
| } |
| |
| /// Runs a [benchmark] [iterations] times and reports the best result. |
| /// |
| /// Use [warmUpBenchmark] to discard cold performance results. |
| Future<num> runBenchmark(Benchmark benchmark, { |
| int iterations: 1, |
| bool warmUpBenchmark: false |
| }) async { |
| await benchmark.init(); |
| |
| List<num> allRuns = <num>[]; |
| |
| num minValue; |
| |
| if (warmUpBenchmark) |
| await benchmark.run(); |
| |
| while (iterations > 0) { |
| iterations--; |
| |
| print(''); |
| |
| try { |
| num result = await benchmark.run(); |
| allRuns.add(result); |
| |
| if (minValue == null || result < minValue) { |
| benchmark.bestResult = benchmark.lastResult; |
| minValue = result; |
| } |
| } catch (error) { |
| print('benchmark failed with error: $error'); |
| } |
| } |
| |
| return minValue; |
| } |