| Index: bin/inference/print_summary.dart
|
| diff --git a/bin/inference/print_summary.dart b/bin/inference/print_summary.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..f03607c3af65bedb2016c8ae27b74df0c3f63efc
|
| --- /dev/null
|
| +++ b/bin/inference/print_summary.dart
|
| @@ -0,0 +1,96 @@
|
| +// 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.
|
| +
|
| +/// Utility to display statistics about "sends" as a table on the command line.
|
| +library compiler.tool.stats.print_summary;
|
| +
|
| +import 'dart:io';
|
| +import 'dart:convert';
|
| +import 'package:dart2js_info/info.dart';
|
| +import 'package:dart2js_info/src/table.dart';
|
| +
|
| +main(args) {
|
| + var file = args.length > 0 ? args[0] : 'out.js.info.json';
|
| + var json = JSON.decode(new File(file).readAsStringSync());
|
| + var results = AllInfo.parseFromJson(json);
|
| + print(formatAsTable(results));
|
| +}
|
| +
|
| +/// Formats [results] as a table.
|
| +String formatAsTable(AllInfo all) {
|
| + var visitor = new _Counter();
|
| + all.accept(visitor);
|
| + var table = new Table();
|
| + table.declareColumn('bundle');
|
| +
|
| + int colorIndex = 0;
|
| + visitAllMetrics((m, _) {
|
| + if (m is GroupedMetric) colorIndex = (colorIndex + 1) % _groupColors.length;
|
| + table.declareColumn(m.name,
|
| + abbreviate: true, color: _groupColors[colorIndex]);
|
| + });
|
| + table.addHeader();
|
| + appendCount(n) => table.addEntry(n == null ? 0 : n);
|
| +
|
| + for (var bundle in visitor.bundleTotals.keys) {
|
| + table.addEntry(bundle);
|
| + visitAllMetrics(
|
| + (m, _) => appendCount(visitor.bundleTotals[bundle].counters[m]));
|
| + }
|
| + table.addEmptyRow();
|
| + table.addHeader();
|
| + table.addEntry('total');
|
| + visitAllMetrics((m, _) => appendCount(visitor.totals.counters[m]));
|
| +
|
| + appendPercent(count, total) {
|
| + if (count == null) count = 0;
|
| + if (total == null) total = 0;
|
| + var percent = count * 100 / total;
|
| + table.addEntry(percent == 100 ? 100 : percent.toStringAsFixed(2));
|
| + }
|
| +
|
| + table.addEntry('%');
|
| + visitAllMetrics((metric, parents) {
|
| + if (parents == null || parents.isEmpty) {
|
| + table.addEntry(100);
|
| + } else {
|
| + appendPercent(
|
| + visitor.totals.counters[metric], visitor.totals.counters[parents[0]]);
|
| + }
|
| + });
|
| +
|
| + return table.toString();
|
| +}
|
| +
|
| +/// Visitor that adds up results for all functions in libraries, and all
|
| +/// libraries in a bundle.
|
| +class _Counter extends RecursiveInfoVisitor {
|
| + Map<String, Measurements> bundleTotals = {};
|
| + Measurements currentBundleTotals;
|
| + Measurements totals = new Measurements();
|
| +
|
| + visitLibrary(LibraryInfo info) {
|
| + var uri = info.uri;
|
| + var bundle = uri.scheme == 'package'
|
| + ? uri.pathSegments.first
|
| + : uri.scheme == 'file' ? uri.pathSegments.last : '$uri';
|
| + currentBundleTotals =
|
| + bundleTotals.putIfAbsent(bundle, () => new Measurements());
|
| + super.visitLibrary(info);
|
| + totals.addFrom(currentBundleTotals);
|
| + }
|
| +
|
| + visitFunction(FunctionInfo function) {
|
| + var measurements = function.measurements;
|
| + if (measurements == null) return;
|
| + currentBundleTotals.addFrom(measurements);
|
| + }
|
| +}
|
| +
|
| +const _groupColors = const [_YELLOW_COLOR, _NO_COLOR];
|
| +
|
| +const _NO_COLOR = "\x1b[0m";
|
| +const _GREEN_COLOR = "\x1b[32m";
|
| +const _YELLOW_COLOR = "\x1b[33m";
|
| +const _WHITE_COLOR = "\x1b[37m";
|
|
|