| OLD | NEW | 
|---|
| 1 // Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file | 1 // Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file | 
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a | 
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. | 
| 4 | 4 | 
| 5 /// An entrypoint used to run portions of front_end and measure its performance. | 5 /// An entrypoint used to run portions of front_end and measure its performance. | 
| 6 library front_end.tool.perf; | 6 library front_end.tool.perf; | 
| 7 | 7 | 
| 8 import 'dart:async'; | 8 import 'dart:async'; | 
| 9 import 'dart:io' show exit, stderr; | 9 import 'dart:io' show exit, stderr; | 
| 10 | 10 | 
| 11 import 'package:analyzer/dart/ast/ast.dart'; | 11 import 'package:analyzer/dart/ast/ast.dart'; | 
| 12 import 'package:analyzer/dart/ast/token.dart'; |  | 
| 13 import 'package:analyzer/error/listener.dart'; | 12 import 'package:analyzer/error/listener.dart'; | 
| 14 import 'package:analyzer/file_system/file_system.dart' show ResourceUriResolver; | 13 import 'package:analyzer/file_system/file_system.dart' show ResourceUriResolver; | 
| 15 import 'package:analyzer/file_system/physical_file_system.dart' | 14 import 'package:analyzer/file_system/physical_file_system.dart' | 
| 16     show PhysicalResourceProvider; | 15     show PhysicalResourceProvider; | 
| 17 import 'package:analyzer/source/package_map_resolver.dart'; | 16 import 'package:analyzer/source/package_map_resolver.dart'; | 
| 18 import 'package:analyzer/src/context/builder.dart'; | 17 import 'package:analyzer/src/context/builder.dart'; | 
| 19 import 'package:analyzer/src/dart/scanner/reader.dart'; |  | 
| 20 import 'package:analyzer/src/dart/scanner/scanner.dart'; |  | 
| 21 import 'package:analyzer/src/dart/sdk/sdk.dart' show FolderBasedDartSdk; | 18 import 'package:analyzer/src/dart/sdk/sdk.dart' show FolderBasedDartSdk; | 
| 22 import 'package:analyzer/src/generated/parser.dart'; | 19 import 'package:analyzer/src/generated/parser.dart'; | 
| 23 import 'package:analyzer/src/generated/source.dart'; | 20 import 'package:analyzer/src/generated/source.dart'; | 
| 24 import 'package:analyzer/src/generated/source_io.dart'; | 21 import 'package:analyzer/src/generated/source_io.dart'; | 
| 25 import 'package:kernel/analyzer/loader.dart'; | 22 import 'package:kernel/analyzer/loader.dart'; | 
| 26 import 'package:kernel/kernel.dart'; | 23 import 'package:kernel/kernel.dart'; | 
| 27 import 'package:package_config/discovery.dart'; | 24 import 'package:package_config/discovery.dart'; | 
| 28 | 25 | 
|  | 26 import 'package:front_end/src/scanner/reader.dart'; | 
|  | 27 import 'package:front_end/src/scanner/scanner.dart'; | 
|  | 28 import 'package:front_end/src/scanner/token.dart'; | 
|  | 29 | 
| 29 /// Cumulative total number of chars scanned. | 30 /// Cumulative total number of chars scanned. | 
| 30 int scanTotalChars = 0; | 31 int scanTotalChars = 0; | 
| 31 | 32 | 
| 32 /// Cumulative time spent scanning. | 33 /// Cumulative time spent scanning. | 
| 33 Stopwatch scanTimer = new Stopwatch(); | 34 Stopwatch scanTimer = new Stopwatch(); | 
| 34 | 35 | 
| 35 /// Factory to load and resolve app, packages, and sdk sources. | 36 /// Factory to load and resolve app, packages, and sdk sources. | 
| 36 SourceFactory sources; | 37 SourceFactory sources; | 
| 37 | 38 | 
| 38 main(List<String> args) async { | 39 main(List<String> args) async { | 
| (...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 198   return parser.parseCompilationUnit(token); | 199   return parser.parseCompilationUnit(token); | 
| 199 } | 200 } | 
| 200 | 201 | 
| 201 /// Scan [source] and return the first token produced by the scanner. | 202 /// Scan [source] and return the first token produced by the scanner. | 
| 202 Token tokenize(Source source) { | 203 Token tokenize(Source source) { | 
| 203   scanTimer.start(); | 204   scanTimer.start(); | 
| 204   var contents = source.contents.data; | 205   var contents = source.contents.data; | 
| 205   scanTotalChars += contents.length; | 206   scanTotalChars += contents.length; | 
| 206   // TODO(sigmund): is there a way to scan from a random-access-file without | 207   // TODO(sigmund): is there a way to scan from a random-access-file without | 
| 207   // first converting to String? | 208   // first converting to String? | 
| 208   var scanner = new Scanner(source, new CharSequenceReader(contents), | 209   var scanner = new _Scanner(contents); | 
| 209       AnalysisErrorListener.NULL_LISTENER)..preserveComments = false; |  | 
| 210   var token = scanner.tokenize(); | 210   var token = scanner.tokenize(); | 
| 211   scanTimer.stop(); | 211   scanTimer.stop(); | 
| 212   return token; | 212   return token; | 
| 213 } | 213 } | 
| 214 | 214 | 
|  | 215 class _Scanner extends Scanner { | 
|  | 216   _Scanner(String contents) : super(new CharSequenceReader(contents)) { | 
|  | 217     preserveComments = false; | 
|  | 218   } | 
|  | 219 | 
|  | 220   @override | 
|  | 221   void reportError(errorCode, int offset, List<Object> arguments) { | 
|  | 222     // ignore errors. | 
|  | 223   } | 
|  | 224 } | 
|  | 225 | 
| 215 /// Report that metric [name] took [time] micro-seconds to process | 226 /// Report that metric [name] took [time] micro-seconds to process | 
| 216 /// [scanTotalChars] characters. | 227 /// [scanTotalChars] characters. | 
| 217 void report(String name, int time) { | 228 void report(String name, int time) { | 
| 218   var sb = new StringBuffer(); | 229   var sb = new StringBuffer(); | 
| 219   sb.write('$name: $time us, ${time ~/ 1000} ms'); | 230   sb.write('$name: $time us, ${time ~/ 1000} ms'); | 
| 220   sb.write(', ${scanTotalChars * 1000 ~/ time} chars/ms'); | 231   sb.write(', ${scanTotalChars * 1000 ~/ time} chars/ms'); | 
| 221   print('$sb'); | 232   print('$sb'); | 
| 222 } | 233 } | 
| 223 | 234 | 
| 224 // TODO(sigmund): replace this once kernel is produced by the frontend directly. | 235 // TODO(sigmund): replace this once kernel is produced by the frontend directly. | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
| 236     const int errorLimit = 100; | 247     const int errorLimit = 100; | 
| 237     stderr.writeln(errors.take(errorLimit).join('\n')); | 248     stderr.writeln(errors.take(errorLimit).join('\n')); | 
| 238     if (errors.length > errorLimit) { | 249     if (errors.length > errorLimit) { | 
| 239       stderr.writeln('[error] ${errors.length - errorLimit} errors not shown'); | 250       stderr.writeln('[error] ${errors.length - errorLimit} errors not shown'); | 
| 240     } | 251     } | 
| 241   } | 252   } | 
| 242   dartkTimer.stop(); | 253   dartkTimer.stop(); | 
| 243   report("kernel_gen_e2e", dartkTimer.elapsedMicroseconds); | 254   report("kernel_gen_e2e", dartkTimer.elapsedMicroseconds); | 
| 244   return program; | 255   return program; | 
| 245 } | 256 } | 
| OLD | NEW | 
|---|