From 2db312a792429b80300414542d164103a9ce017b Mon Sep 17 00:00:00 2001 From: RoosterDragon Date: Sun, 24 Oct 2021 13:45:43 +0100 Subject: [PATCH] In MiniYaml, presize some collections and trim lists during parsing. --- OpenRA.Game/MiniYaml.cs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/OpenRA.Game/MiniYaml.cs b/OpenRA.Game/MiniYaml.cs index 8c4630390c..45626935fc 100644 --- a/OpenRA.Game/MiniYaml.cs +++ b/OpenRA.Game/MiniYaml.cs @@ -118,7 +118,7 @@ namespace OpenRA public Dictionary ToDictionary( Func keySelector, Func elementSelector) { - var ret = new Dictionary(); + var ret = new Dictionary(Nodes.Count); foreach (var y in Nodes) { var key = keySelector(y.Key); @@ -208,7 +208,10 @@ namespace OpenRA throw new YamlException($"Bad indent in miniyaml at {location}"); while (levels.Count > level + 1) + { + levels[levels.Count - 1].TrimExcess(); levels.RemoveAt(levels.Count - 1); + } // Extract key, value, comment from line as `: #` // The # character is allowed in the value if escaped (\#). @@ -315,7 +318,7 @@ namespace OpenRA .Where(n => n.Key != null) .ToDictionary(n => n.Key, n => n.Value); - var resolved = new Dictionary(); + var resolved = new Dictionary(tree.Count); foreach (var kv in tree) { var inherited = new Dictionary(); @@ -398,8 +401,8 @@ namespace OpenRA /// static List MergeSelfPartial(List existingNodes) { - var keys = new HashSet(); - var ret = new List(); + var keys = new HashSet(existingNodes.Count); + var ret = new List(existingNodes.Count); foreach (var n in existingNodes) { if (keys.Add(n.Key)) @@ -435,7 +438,7 @@ namespace OpenRA if (overrideNodes.Count == 0) return existingNodes; - var ret = new List(); + var ret = new List(existingNodes.Count + overrideNodes.Count); var existingDict = existingNodes.ToDictionaryWithConflictLog(x => x.Key, "MiniYaml.Merge", null, x => $"{x.Key} (at {x.Location})"); var overrideDict = overrideNodes.ToDictionaryWithConflictLog(x => x.Key, "MiniYaml.Merge", null, x => $"{x.Key} (at {x.Location})");