Skip to content

Commit 5205752

Browse files
#136 Insufficient performance - GraphOverrider
1 parent 10d6e3a commit 5205752

2 files changed

Lines changed: 27 additions & 65 deletions

File tree

src/Pure.DI.Core/Core/DictionaryExtensions.cs

Lines changed: 0 additions & 18 deletions
This file was deleted.

src/Pure.DI.Core/Core/GraphOverrider.cs

Lines changed: 27 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public IGraph<DependencyNode, Dependency> Rewrite(
1212
IGraph<DependencyNode, Dependency> graph,
1313
ref int bindingId)
1414
{
15-
var entries = new List<GraphEntry<DependencyNode, Dependency>>(graph.Entries.Count);
15+
var entries = new Dictionary<DependencyNode, IReadOnlyCollection<Dependency>>(graph.Entries.Count);
1616
var processed = new Dictionary<int, DependencyNode>(graph.Entries.Count);
1717
foreach (var rootNode in from node in graph.Vertices where node.Root is not null select node)
1818
{
@@ -39,28 +39,31 @@ public IGraph<DependencyNode, Dependency> Rewrite(
3939
return graph;
4040
}
4141

42-
var entriesMap = entries.ToDictionary(i => i.Target, i => i.Edges);
43-
foreach (var entry in graph.Entries.Where(i => !entriesMap.ContainsKey(i.Target)))
42+
foreach (var graphEntry in graph.Entries)
4443
{
45-
entriesMap.Add(entry.Target, entry.Edges);
44+
if (entries.ContainsKey(graphEntry.Target))
45+
{
46+
continue;
47+
}
48+
49+
entries[graphEntry.Target] = graphEntry.Edges;
4650
}
4751

48-
return new Graph<DependencyNode, Dependency>(
49-
entriesMap.Select(i => new GraphEntry<DependencyNode, Dependency>(i.Key, i.Value)));
52+
return new Graph<DependencyNode, Dependency>(entries.Select(i => new GraphEntry<DependencyNode, Dependency>(i.Key, i.Value)));
5053
}
5154

5255
private DependencyNode Override(
53-
IDictionary<int, DependencyNode> processed,
54-
IReadOnlyDictionary<Injection, DependencyNode> nodes,
55-
IReadOnlyDictionary<Injection, DependencyNode> localOverrides,
56+
Dictionary<int, DependencyNode> processed,
57+
Dictionary<Injection, DependencyNode> nodes,
58+
Dictionary<Injection, DependencyNode> localOverrides,
5659
bool consumeLocalOverrides,
57-
IReadOnlyDictionary<int, DpOverride> overrides,
60+
Dictionary<int, DpOverride> overrides,
5861
MdSetup setup,
5962
IGraph<DependencyNode, Dependency> graph,
6063
DependencyNode rootNode,
6164
DependencyNode targetNode,
6265
ref int maxId,
63-
List<GraphEntry<DependencyNode, Dependency>> entries)
66+
Dictionary<DependencyNode, IReadOnlyCollection<Dependency>> entries)
6467
{
6568
if (!graph.TryGetInEdges(targetNode, out var dependencies))
6669
{
@@ -73,15 +76,16 @@ private DependencyNode Override(
7376
nodes,
7477
localOverrides,
7578
overrides);
79+
7680
if (branchProcessed.TryGetValue(targetNode.Binding.Id, out var node))
7781
{
7882
return node;
7983
}
8084

81-
var nodesMap = nodes.ToDictionary();
85+
var nodesMap = new Dictionary<Injection, DependencyNode>(nodes);
8286
var localNodesMap = CreateLocalNodesMap(nodesMap, localOverrides, consumeLocalOverrides);
8387

84-
var overridesMap = overrides.ToDictionary();
88+
var overridesMap = new Dictionary<int, DpOverride>(overrides);
8589
IEnumerable<ImmutableArray<DpOverride>> overridesEnumerable;
8690
if (targetNode.Factory is {} factory)
8791
{
@@ -178,7 +182,7 @@ private DependencyNode Override(
178182
var currentDependency = dependency with { Target = targetNode };
179183
if (!localNodesMap.TryGetValue(currentDependency.Injection, out var overridingSourceNode))
180184
{
181-
var sourceOverrides = overridesMap.ToDictionary();
185+
var sourceOverrides = new Dictionary<int, DpOverride>(overridesMap);
182186
var source = Override(
183187
branchProcessed,
184188
nodesMap,
@@ -206,17 +210,16 @@ private DependencyNode Override(
206210
newDependencies.Add(currentDependency);
207211
}
208212

209-
UpsertEntry(entries, targetNode, newDependencies);
210-
213+
entries[targetNode] = newDependencies;
211214
return targetNode;
212215
}
213216

214-
private static IDictionary<int, DependencyNode> CreateBranchProcessedCache(
215-
IDictionary<int, DependencyNode> processed,
217+
private static Dictionary<int, DependencyNode> CreateBranchProcessedCache(
218+
Dictionary<int, DependencyNode> processed,
216219
bool consumeLocalOverrides,
217-
IReadOnlyDictionary<Injection, DependencyNode> nodes,
218-
IReadOnlyDictionary<Injection, DependencyNode> localOverrides,
219-
IReadOnlyDictionary<int, DpOverride> overrides)
220+
Dictionary<Injection, DependencyNode> nodes,
221+
Dictionary<Injection, DependencyNode> localOverrides,
222+
Dictionary<int, DpOverride> overrides)
220223
{
221224
// Rewritten nodes are context-dependent when any override scope is active.
222225
// In such cases we isolate memoization to the current branch to avoid
@@ -230,11 +233,11 @@ private static IDictionary<int, DependencyNode> CreateBranchProcessedCache(
230233
}
231234

232235
private static Dictionary<Injection, DependencyNode> CreateLocalNodesMap(
233-
IReadOnlyDictionary<Injection, DependencyNode> nodes,
234-
IReadOnlyDictionary<Injection, DependencyNode> localOverrides,
236+
Dictionary<Injection, DependencyNode> nodes,
237+
Dictionary<Injection, DependencyNode> localOverrides,
235238
bool consumeLocalOverrides)
236239
{
237-
var localNodesMap = nodes.ToDictionary();
240+
var localNodesMap = new Dictionary<Injection, DependencyNode>(nodes);
238241
if (!consumeLocalOverrides || localOverrides.Count <= 0)
239242
{
240243
return localNodesMap;
@@ -247,27 +250,4 @@ private static Dictionary<Injection, DependencyNode> CreateLocalNodesMap(
247250

248251
return localNodesMap;
249252
}
250-
251-
private static void UpsertEntry(
252-
ICollection<GraphEntry<DependencyNode, Dependency>> entries,
253-
DependencyNode targetNode,
254-
IReadOnlyCollection<Dependency> newDependencies)
255-
{
256-
var entry = new GraphEntry<DependencyNode, Dependency>(targetNode, newDependencies);
257-
if (entries is not List<GraphEntry<DependencyNode, Dependency>> list)
258-
{
259-
entries.Add(entry);
260-
return;
261-
}
262-
263-
var entryIndex = list.FindIndex(i => Equals(i.Target, targetNode));
264-
if (entryIndex >= 0)
265-
{
266-
list[entryIndex] = entry;
267-
}
268-
else
269-
{
270-
list.Add(entry);
271-
}
272-
}
273253
}

0 commit comments

Comments
 (0)