blob: afc10112bd4fcc04e38807f6fdedd13574f804d7 [file] [log] [blame]
// Copyright (c) 2022, 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:convert';
import 'dart:io';
import 'package:analyzer_utilities/package_root.dart';
import '../benchmarks.dart';
import 'utils.dart';
abstract class AbstractCmdLineBenchmark extends Benchmark {
AbstractCmdLineBenchmark(super.id, super.description, {required super.kind});
@override
int get maxIterations => 3;
String get workingDir;
List<String> analyzeWhat(bool quick);
void cleanup() {}
@override
Future<BenchMarkResult> run(
{required String dartSdkPath,
bool quick = false,
bool verbose = false}) async {
if (!quick) {
deleteServerCache();
}
setup();
var analyzeThis = analyzeWhat(quick);
var stopwatchNoCache = Stopwatch()..start();
await runProcess(
'$dartSdkPath/bin/dart',
['analyze', '--suppress-analytics', ...analyzeThis],
cwd: workingDir,
verbose: false,
);
stopwatchNoCache.stop();
var stopwatchWithCache = Stopwatch()..start();
await runProcess(
'$dartSdkPath/bin/dart',
['analyze', '--suppress-analytics', ...analyzeThis],
cwd: workingDir,
verbose: false,
);
stopwatchWithCache.stop();
var result = CompoundBenchMarkResult(id);
result.add('no-cache',
BenchMarkResult('micros', stopwatchNoCache.elapsedMicroseconds));
result.add('with-cache',
BenchMarkResult('micros', stopwatchWithCache.elapsedMicroseconds));
if (!quick) {
deleteServerCache();
List<String> stdout = [];
await runProcess(
'$dartSdkPath/bin/dart',
[
'analyze',
'--suppress-analytics',
'--format=json',
'--memory',
...analyzeThis
],
cwd: workingDir,
verbose: false,
stdout: stdout,
);
int kbNoCache = jsonDecode(stdout[1])['memory'] as int;
result.add('no-cache-memory', BenchMarkResult('bytes', kbNoCache * 1024));
stdout = [];
await runProcess(
'$dartSdkPath/bin/dart',
[
'analyze',
'--suppress-analytics',
'--format=json',
'--memory',
...analyzeThis
],
cwd: workingDir,
verbose: false,
stdout: stdout,
);
int kbWithCache = jsonDecode(stdout[1])['memory'] as int;
result.add(
'with-cache-memory', BenchMarkResult('bytes', kbWithCache * 1024));
}
cleanup();
return result;
}
void setup() {}
}
class CmdLineOneProjectBenchmark extends AbstractCmdLineBenchmark {
CmdLineOneProjectBenchmark()
: super('dart-analyze-one-project',
'Run dart analyze on one project with and without a cache',
kind: 'group');
@override
String get workingDir => packageRoot;
@override
List<String> analyzeWhat(bool quick) =>
quick ? ['meta'] : ['analysis_server'];
}
class CmdLineSeveralProjectsBenchmark extends AbstractCmdLineBenchmark {
CmdLineSeveralProjectsBenchmark()
: super('dart-analyze-several-projects',
'Run dart analyze on several projects with and without a cache',
kind: 'group');
@override
String get workingDir => packageRoot;
@override
List<String> analyzeWhat(bool quick) => quick
? ['meta']
: [
'analysis_server',
'analysis_server_client',
'analyzer',
'analyzer_cli',
'analyzer_plugin',
'analyzer_utilities',
'_fe_analyzer_shared',
];
}
class CmdLineSmallFileBenchmark extends AbstractCmdLineBenchmark {
Directory? _tempDir;
CmdLineSmallFileBenchmark()
: super('dart-analyze-small-file',
'Run dart analyze on a small file with and without a cache',
kind: 'group');
@override
String get workingDir => _tempDir!.path;
@override
List<String> analyzeWhat(bool quick) => ['t.dart'];
@override
void cleanup() {
_tempDir!.deleteSync(recursive: true);
_tempDir = null;
}
@override
void setup() {
var dir = Directory.systemTemp.createTempSync('analyzer-benchmark');
var file = File.fromUri(dir.uri.resolve('t.dart'));
file.writeAsStringSync('''
void main() {
print("Hello, world!");
}''');
_tempDir = dir;
}
}