| Index: benchmark/lib/dashboard.dart
|
| diff --git a/benchmark/lib/dashboard.dart b/benchmark/lib/dashboard.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..8d15e9ec74bbd0377bc54b5547e7b42531d4b975
|
| --- /dev/null
|
| +++ b/benchmark/lib/dashboard.dart
|
| @@ -0,0 +1,118 @@
|
| +// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
|
| +// for details. All rights reserved. Use of this source code is governed by a
|
| +// BSD-style license that can be found in the LICENSE file.
|
| +
|
| +library protoc.benchmark.html_runner;
|
| +
|
| +import 'dart:async' show Future;
|
| +import 'dart:html';
|
| +
|
| +import 'generated/benchmark.pb.dart' as pb;
|
| +import 'dashboard_model.dart' show DashboardModel;
|
| +import 'dashboard_view.dart' show DashboardView;
|
| +import 'report.dart' show createPlatform, createPackages, encodeReport;
|
| +import 'suite.dart' show runSuite;
|
| +
|
| +import '../data/index.dart' as data;
|
| +
|
| +/// Displays a dashboard that can be used to run benchmarks.
|
| +Future showDashboard(pb.Suite suite, Element container) async {
|
| +
|
| + // set up model
|
| +
|
| + var env = await loadBrowserEnv();
|
| + var reports = await loadReports();
|
| +
|
| + var defaultReport = new pb.Report()
|
| + ..env = env;
|
| + var model =
|
| + new DashboardModel(reports, chooseBaseline(env, reports), defaultReport);
|
| +
|
| + var view = new DashboardView();
|
| +
|
| + // set up event handlers
|
| +
|
| + bool running = false;
|
| + void runBenchmarks() {
|
| + if (running) return;
|
| + running = true;
|
| + () async {
|
| + for (pb.Report report in runSuite(suite)) {
|
| + report.env = env;
|
| + model = model.withReport(report);
|
| + await window.animationFrame;
|
| + view.render(model);
|
| + await new Future(() => null); // exit to regular timer task
|
| + }
|
| + running = false;
|
| + }();
|
| + }
|
| +
|
| + view.onRunButtonClick.listen((_) => runBenchmarks());
|
| +
|
| + view.onMenuChange.listen((String item) {
|
| + model = model.withBaseline(item);
|
| + view.render(model);
|
| + });
|
| +
|
| + // show the view
|
| +
|
| + view.render(model);
|
| + container.children.clear();
|
| + container.append(view.elt);
|
| +}
|
| +
|
| +Future<pb.Env> loadBrowserEnv() async {
|
| + const advice = "Run a VM benchmark to create this file.";
|
| + var pubspecYaml = await _loadDataFile(data.pubspecYamlName, advice: advice);
|
| + var pubspecLock = await _loadDataFile(data.pubspecLockName, advice: advice);
|
| + var hostname = await _loadDataFile(data.hostfileName, advice: advice);
|
| +
|
| + var platform = createPlatform()
|
| + ..hostname = hostname
|
| + ..userAgent = window.navigator.userAgent;
|
| +
|
| + return new pb.Env()
|
| + ..page = window.location.pathname
|
| + ..platform = platform
|
| + ..packages = createPackages(pubspecYaml, pubspecLock);
|
| +}
|
| +
|
| +/// Loads all the reports saved to benchmark/data.
|
| +Future<Map<String, pb.Report>> loadReports() async {
|
| + var out = <String, pb.Report>{};
|
| + // TODO: maybe parallelize?
|
| + for (var name in data.allReportNames) {
|
| + String json =
|
| + await _loadDataFile(name, optional: (name == data.latestVMReportName));
|
| + if (json != null) {
|
| + out[name] = new pb.Report.fromJson(json);
|
| + }
|
| + }
|
| + print("loaded ${out.length} reports");
|
| + return out;
|
| +}
|
| +
|
| +/// Choose the report to display on the left side for comparison.
|
| +/// Returns null if no comparable report is found.
|
| +String chooseBaseline(pb.Env env, Map<String, pb.Report> reports) {
|
| + for (var name in reports.keys) {
|
| + var candidate = reports[name];
|
| + if (candidate.env.platform == env.platform) return name;
|
| + }
|
| + return null;
|
| +}
|
| +
|
| +Future<String> _loadDataFile(String name,
|
| + {bool optional: false, String advice}) async {
|
| + try {
|
| + return await HttpRequest.getString("/data/$name");
|
| + } catch (e) {
|
| + if (optional) return null;
|
| + String error = "File is missing in benchmark/data: $name";
|
| + if (advice != null) {
|
| + error += ". $advice";
|
| + }
|
| + throw error;
|
| + }
|
| +}
|
|
|