| Index: pkg/front_end/tool/perf.dart
|
| diff --git a/pkg/front_end/tool/perf.dart b/pkg/front_end/tool/perf.dart
|
| index d56012e6529e8f68b4f3e72664c5adac4280b900..d900b9708b99e454fd10272b0c9131950fb7c54b 100644
|
| --- a/pkg/front_end/tool/perf.dart
|
| +++ b/pkg/front_end/tool/perf.dart
|
| @@ -6,7 +6,7 @@
|
| library front_end.tool.perf;
|
|
|
| import 'dart:async';
|
| -import 'dart:io' show exit;
|
| +import 'dart:io' show exit, stderr;
|
|
|
| import 'package:analyzer/dart/ast/ast.dart';
|
| import 'package:analyzer/dart/ast/token.dart';
|
| @@ -22,6 +22,8 @@ import 'package:analyzer/src/dart/sdk/sdk.dart' show FolderBasedDartSdk;
|
| import 'package:analyzer/src/generated/parser.dart';
|
| import 'package:analyzer/src/generated/source.dart';
|
| import 'package:analyzer/src/generated/source_io.dart';
|
| +import 'package:kernel/analyzer/loader.dart';
|
| +import 'package:kernel/kernel.dart';
|
| import 'package:package_config/discovery.dart';
|
|
|
| /// Cumulative total number of chars scanned.
|
| @@ -46,19 +48,36 @@ main(List<String> args) async {
|
|
|
| await setup(entryUri);
|
|
|
| - if (bench == 'scan') {
|
| - Set<Source> files = scanReachableFiles(entryUri);
|
| - // TODO(sigmund): consider replacing the warmup with instrumented snapshots.
|
| - for (int i = 0; i < 10; i++) scanFiles(files);
|
| - } else if (bench == 'parse') {
|
| - Set<Source> files = scanReachableFiles(entryUri);
|
| - // TODO(sigmund): consider replacing the warmup with instrumented snapshots.
|
| - for (int i = 0; i < 10; i++) parseFiles(files);
|
| - } else {
|
| - print('unsupported bench-id: $bench. Please specify "scan" or "parse"');
|
| + var handlers = {
|
| + 'scan': () async {
|
| + Set<SourceFile> files = scanReachableFiles(entryUri);
|
| + // TODO(sigmund): replace the warmup with instrumented snapshots.
|
| + for (int i = 0; i < 10; i++) scanFiles(files);
|
| + },
|
| + 'parse': () async {
|
| + Set<SourceFile> files = scanReachableFiles(entryUri);
|
| + // TODO(sigmund): replace the warmup with instrumented snapshots.
|
| + for (int i = 0; i < 10; i++) parseFiles(files);
|
| + },
|
| + 'kernel_gen_e2e': () async {
|
| + // TODO(sigmund): remove. This is used to compute the input size, we
|
| + // should extract input size from frontend instead.
|
| + scanReachableFiles(entryUri);
|
| + // TODO(sigmund): replace this warmup. Note that for very large programs,
|
| + // the GC pressure on the VM seems to make this worse with time (maybe we
|
| + // are leaking memory?). That's why we run it twice and not 10 times.
|
| + for (int i = 0; i < 2; i++) await generateKernel(entryUri);
|
| + },
|
| + };
|
| +
|
| + var handler = handlers[bench];
|
| + if (handler == null) {
|
| // TODO(sigmund): implement the remaining benchmarks.
|
| + print('unsupported bench-id: $bench. Please specify one of the following: '
|
| + '${handler.keys.join(", ")}');
|
| exit(1);
|
| }
|
| + await handler();
|
|
|
| totalTimer.stop();
|
| report("total", totalTimer.elapsedMicroseconds);
|
| @@ -201,3 +220,26 @@ void report(String name, int time) {
|
| sb.write(', ${scanTotalChars * 1000 ~/ time} chars/ms');
|
| print('$sb');
|
| }
|
| +
|
| +// TODO(sigmund): replace this once kernel is produced by the frontend directly.
|
| +Future<Program> generateKernel(Uri entryUri) async {
|
| + var dartkTimer = new Stopwatch()..start();
|
| + var options = new DartOptions(strongMode: false, sdk: 'sdk');
|
| + var packages =
|
| + await createPackages(options.packagePath, discoveryPath: entryUri.path);
|
| + var repository = new Repository();
|
| + DartLoader loader = new DartLoader(repository, options, packages);
|
| +
|
| + Program program = loader.loadProgram(entryUri.path);
|
| + List errors = loader.errors;
|
| + if (errors.isNotEmpty) {
|
| + const int errorLimit = 100;
|
| + stderr.writeln(errors.take(errorLimit).join('\n'));
|
| + if (errors.length > errorLimit) {
|
| + stderr.writeln('[error] ${errors.length - errorLimit} errors not shown');
|
| + }
|
| + }
|
| + dartkTimer.stop();
|
| + report("kernel_gen_e2e", dartkTimer.elapsedMicroseconds);
|
| + return program;
|
| +}
|
|
|