[vm/bytecode] Avoid recalcualting class hierarchy for each dilp file
Compilation time in package-split mode with bytecode on a large app:
Before: 98 seconds
After: 37 seconds
Issue: b/131915611.
Change-Id: Ibc0ea460c9bb78d33441f91e977a914f97e8ce7f
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/101325
Reviewed-by: Zach Anderson <zra@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
diff --git a/pkg/vm/lib/bytecode/gen_bytecode.dart b/pkg/vm/lib/bytecode/gen_bytecode.dart
index f8ae346..21721a6 100644
--- a/pkg/vm/lib/bytecode/gen_bytecode.dart
+++ b/pkg/vm/lib/bytecode/gen_bytecode.dart
@@ -57,10 +57,11 @@
Map<String, String> environmentDefines: const <String, String>{},
ErrorReporter errorReporter,
List<Library> libraries,
+ ClassHierarchy hierarchy,
}) {
final coreTypes = new CoreTypes(component);
void ignoreAmbiguousSupertypes(Class cls, Supertype a, Supertype b) {}
- final hierarchy = new ClassHierarchy(component,
+ hierarchy ??= new ClassHierarchy(component,
onAmbiguousSupertypes: ignoreAmbiguousSupertypes);
final typeEnvironment = new TypeEnvironment(coreTypes, hierarchy);
final constantsBackend = new VmConstantsBackend(coreTypes);
diff --git a/pkg/vm/lib/kernel_front_end.dart b/pkg/vm/lib/kernel_front_end.dart
index 452e2ca..703cfa8 100644
--- a/pkg/vm/lib/kernel_front_end.dart
+++ b/pkg/vm/lib/kernel_front_end.dart
@@ -678,6 +678,14 @@
BytecodeSizeStatistics.reset();
}
+ ClassHierarchy hierarchy;
+ if (genBytecode) {
+ // Calculating class hierarchy is an expensive operation.
+ // Calculate it once and reuse while generating bytecode for each package.
+ hierarchy =
+ new ClassHierarchy(component, onAmbiguousSupertypes: (cls, a, b) {});
+ }
+
await runWithFrontEndCompilerContext(source, compilerOptions, component,
() async {
for (String package in packages) {
@@ -698,6 +706,7 @@
.toList();
generateBytecode(component,
libraries: libraries,
+ hierarchy: hierarchy,
emitSourcePositions: emitBytecodeSourcePositions,
emitAnnotations: emitBytecodeAnnotations,
useFutureBytecodeFormat: useFutureBytecodeFormat,