blob: b79e3a3ccf931ba26e61bb4712889d60910f3727 [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.
// @dart=2.9
import 'dart:convert';
import 'dart:io';
import 'package:compiler/src/dart2js.dart' as dart2js;
Future<void> main(List<String> args) async {
if (args.contains('--child')) {
return;
}
// Include dart2js and prevent tree-shaking to make this program have a
// non-trival snapshot size.
if (args.contains('--train')) {
args.remove('--train');
return dart2js.main(args);
}
var tempDir;
var events;
try {
tempDir = await Directory.systemTemp.createTemp();
final timelinePath =
tempDir.uri.resolve('Startup-timeline.json').toFilePath();
final p = await Process.run(Platform.executable, [
...Platform.executableArguments,
'--timeline_recorder=file:$timelinePath',
'--timeline_streams=VM,Isolate,Embedder',
Platform.script.toFilePath(),
'--child'
]);
if (p.exitCode != 0) {
print(p.stdout);
print(p.stderr);
throw 'Child process failed: ${p.exitCode}';
}
events = jsonDecode(await File(timelinePath).readAsString());
} finally {
await tempDir.delete(recursive: true);
}
var mainIsolateId;
for (final event in events) {
if (event['name'] == 'InitializeIsolate' &&
event['args']['isolateName'] == 'main') {
mainIsolateId = event['args']['isolateId'];
}
}
if (mainIsolateId == null) {
throw 'Could not determine main isolate';
}
void report(String name, String isolateId) {
var filtered = events.where((event) => event['name'] == name);
if (isolateId != null) {
filtered =
filtered.where((event) => event['args']['isolateId'] == isolateId);
}
var micros;
final durations = filtered.where((event) => event['ph'] == 'X');
final begins = filtered.where((event) => event['ph'] == 'B');
final ends = filtered.where((event) => event['ph'] == 'E');
if (durations.length == 1 && begins.length == 0 && ends.length == 0) {
micros = durations.single['dur'];
} else if (durations.length == 0 &&
begins.length == 1 &&
ends.length == 1) {
micros = ends.single['ts'] - begins.single['ts'];
} else {
print(durations.toList());
print(begins.toList());
print(ends.toList());
throw '$name is missing or ambiguous';
}
print('Startup.$name(StartupTime): $micros us.');
}
report('CreateIsolateGroupAndSetupHelper', null);
report('InitializeIsolate', mainIsolateId);
report('ReadProgramSnapshot', mainIsolateId);
}