Skip to content

Commit c812abd

Browse files
jensjohaCommit Queue
authored andcommitted
[kernel] Don't allocate contexts in BinaryPrinter._ensureCanonicalName
When compiling the cfe with an aot-compiled cfe this removes ~43 mb of context allocations in `BinaryPrinter._ensureCanonicalName` and has these changes when benchmarking: ``` msec task-clock:u: -5.0067% +/- 0.6053% (-288.75 +/- 34.91) (5767.31 -> 5478.56) page-faults:u: 2.7077% +/- 0.1426% (2942.48 +/- 155.01) (108670.96 -> 111613.44) cycles:u: -5.3274% +/- 0.6265% (-1278360098.44 +/- 150341087.36) (23995901283.80 -> 22717541185.36) instructions:u: -4.3319% +/- 0.0009% (-1195734804.64 +/- 241700.46) (27602908367.64 -> 26407173563.00) branch-misses:u: -3.4011% +/- 3.0065% (-3245774.08 +/- 2869267.25) (95434325.44 -> 92188551.36) seconds time elapsed: -5.0025% +/- 0.6041% (-0.29 +/- 0.03) (5.77 -> 5.48) seconds user: -5.3148% +/- 0.6838% (-0.29 +/- 0.04) (5.52 -> 5.22) Scavenge( new space) goes from 65 to 64 MarkSweep( promotion) goes from 10 to 9 Evacuate(store buffer) goes from 2 to 1 ``` although most of it is probably a happy accident with the GCs. Compiling the analysis server only gives: ``` page-faults:u: 0.6385% +/- 0.1266% (1058.68 +/- 209.95) (165813.00 -> 166871.68) instructions:u: -0.0158% +/- 0.0005% (-6794934.20 +/- 222091.71) (42904117069.28 -> 42897322135.08) Scavenge( new space) goes from 103 to 101 ``` Change-Id: I85ceece0df699bb2393f3ab72fe6130134b49132 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/438681 Reviewed-by: Johnni Winther <[email protected]> Commit-Queue: Jens Johansen <[email protected]>
1 parent c5d973d commit c812abd

File tree

1 file changed

+19
-18
lines changed

1 file changed

+19
-18
lines changed

pkg/kernel/lib/binary/ast_to_binary.dart

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -984,26 +984,27 @@ class BinaryPrinter implements Visitor<void>, BinarySink {
984984
return canonicalName;
985985
}
986986

987-
CanonicalName ensureCanonicalNameForNode(TreeNode? parentNode) {
988-
if (parentNode is Component) {
989-
return parentNode.root;
990-
}
991-
if (parentNode is NamedNode) {
992-
CanonicalName? canonicalName = parentNode.reference.canonicalName;
993-
if (canonicalName != null) {
994-
return canonicalName;
995-
}
996-
CanonicalName parentCanonicalName =
997-
ensureCanonicalNameForNode(parentNode.parent);
998-
parentNode.bindCanonicalNames(parentCanonicalName);
999-
return parentNode.reference.canonicalName!;
1000-
} else {
1001-
throw new ArgumentError('Missing canonical name for $reference');
987+
_ensureCanonicalName_forNode(reference.node, reference);
988+
return reference.canonicalName!;
989+
}
990+
991+
CanonicalName _ensureCanonicalName_forNode(
992+
TreeNode? parentNode, Reference reference) {
993+
if (parentNode is Component) {
994+
return parentNode.root;
995+
}
996+
if (parentNode is NamedNode) {
997+
CanonicalName? canonicalName = parentNode.reference.canonicalName;
998+
if (canonicalName != null) {
999+
return canonicalName;
10021000
}
1001+
CanonicalName parentCanonicalName =
1002+
_ensureCanonicalName_forNode(parentNode.parent, reference);
1003+
parentNode.bindCanonicalNames(parentCanonicalName);
1004+
return parentNode.reference.canonicalName!;
1005+
} else {
1006+
throw new ArgumentError('Missing canonical name for $reference');
10031007
}
1004-
1005-
ensureCanonicalNameForNode(reference.node);
1006-
return reference.canonicalName!;
10071008
}
10081009

10091010
void checkCanonicalName(CanonicalName node) {

0 commit comments

Comments
 (0)