Index: pkg/front_end/lib/src/base/performace_logger.dart |
diff --git a/pkg/front_end/lib/src/base/performace_logger.dart b/pkg/front_end/lib/src/base/performace_logger.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..47af4cdb9c0d2d693d7a71e0bfa7693e7b45b629 |
--- /dev/null |
+++ b/pkg/front_end/lib/src/base/performace_logger.dart |
@@ -0,0 +1,91 @@ |
+// Copyright (c) 2016, 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. |
+ |
+import 'dart:async'; |
+ |
+/// This class is used to gather and print performance information. |
+class PerformanceLog { |
+ final StringSink sink; |
+ int _level = 0; |
+ |
+ PerformanceLog(this.sink); |
+ |
+ /// Enter a new execution section, which starts at one point of code, runs |
+ /// some time, and then ends at the other point of code. |
+ /// |
+ /// The client must call [PerformanceLogSection.exit] for every [enter]. |
+ PerformanceLogSection enter(String msg) { |
+ writeln('+++ $msg.'); |
+ _level++; |
+ return new PerformanceLogSection(this, msg); |
+ } |
+ |
+ /// Return the result of the function [f] invocation and log the elapsed time. |
+ /// |
+ /// Each invocation of [run] creates a new enclosed section in the log, |
+ /// which begins with printing [msg], then any log output produced during |
+ /// [f] invocation, and ends with printing [msg] with the elapsed time. |
+ T run<T>(String msg, T f()) { |
+ Stopwatch timer = new Stopwatch()..start(); |
+ try { |
+ writeln('+++ $msg.'); |
+ _level++; |
+ return f(); |
+ } finally { |
+ _level--; |
+ int ms = timer.elapsedMilliseconds; |
+ writeln('--- $msg in $ms ms.'); |
+ } |
+ } |
+ |
+ /// Return the result of the function [f] invocation and log the elapsed time. |
+ /// |
+ /// Each invocation of [run] creates a new enclosed section in the log, |
+ /// which begins with printing [msg], then any log output produced during |
+ /// [f] invocation, and ends with printing [msg] with the elapsed time. |
+ Future<T> runAsync<T>(String msg, Future<T> f()) async { |
+ Stopwatch timer = new Stopwatch()..start(); |
+ try { |
+ writeln('+++ $msg.'); |
+ _level++; |
+ return await f(); |
+ } finally { |
+ _level--; |
+ int ms = timer.elapsedMilliseconds; |
+ writeln('--- $msg in $ms ms.'); |
+ } |
+ } |
+ |
+ /// Write a new line into the log. |
+ void writeln(String msg) { |
+ if (sink != null) { |
+ String indent = '\t' * _level; |
+ sink.writeln('$indent$msg'); |
+ } |
+ } |
+} |
+ |
+/** |
+ * The performance measurement section for operations that start and end |
+ * at different place in code, so cannot be run using [PerformanceLog.run]. |
+ * |
+ * The client must call [exit] for every [PerformanceLog.enter]. |
+ */ |
+class PerformanceLogSection { |
+ final PerformanceLog _logger; |
+ final String _msg; |
+ final Stopwatch _timer = new Stopwatch()..start(); |
+ |
+ PerformanceLogSection(this._logger, this._msg); |
+ |
+ /** |
+ * Stop the timer, log the time. |
+ */ |
+ void exit() { |
+ _timer.stop(); |
+ _logger._level--; |
+ int ms = _timer.elapsedMilliseconds; |
+ _logger.writeln('--- $_msg in $ms ms.'); |
+ } |
+} |