From 371187619470366b3924467389e45f754ae000db Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Sun, 15 Apr 2018 09:39:21 +0000 Subject: [PATCH 1/2] Use unsafe merge in joinResults.addChildAndChildren(), for performance --- render/render.go | 2 +- report/node_set.go | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/render/render.go b/render/render.go index 1ba43f48c..27408ef07 100644 --- a/render/render.go +++ b/render/render.go @@ -203,7 +203,7 @@ func (ret *joinResults) addChild(m report.Node, id string, topology string) { func (ret *joinResults) addChildAndChildren(m report.Node, id string, topology string) { ret.addUnmappedChild(m, id, topology) result := ret.nodes[id] - result.Children = result.Children.Merge(m.Children) + result.Children.UnsafeMerge(m.Children) ret.nodes[id] = result ret.mapChild(m.ID, id) } diff --git a/report/node_set.go b/report/node_set.go index eef713748..e236bd3db 100644 --- a/report/node_set.go +++ b/report/node_set.go @@ -72,6 +72,13 @@ func (n NodeSet) Delete(ids ...string) NodeSet { return NodeSet{result} } +// UnsafeMerge combines the two NodeSets, altering n +func (n *NodeSet) UnsafeMerge(other NodeSet) { + other.psMap.ForEach(func(key string, otherVal interface{}) { + n.psMap = n.psMap.UnsafeMutableSet(key, otherVal) + }) +} + // Merge combines the two NodeSets and returns a new result. func (n NodeSet) Merge(other NodeSet) NodeSet { nSize, otherSize := n.Size(), other.Size() From e1c418884edbc94ca7a78fb656dd9cde4dcb80ac Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Sun, 15 Apr 2018 09:39:43 +0000 Subject: [PATCH 2/2] Comment inconsistency between calls in joinResults --- render/render.go | 1 + 1 file changed, 1 insertion(+) diff --git a/render/render.go b/render/render.go index 27408ef07..eb3b6c8a2 100644 --- a/render/render.go +++ b/render/render.go @@ -169,6 +169,7 @@ func (ret *joinResults) mapChild(from, to string) { } // Add m into the results as a top-level node, mapped from original ID +// Note it is not safe to mix calls to add() with addChild(), addChildAndChildren() or addUnmappedChild() func (ret *joinResults) add(from string, m report.Node) { if existing, ok := ret.nodes[m.ID]; ok { m = m.Merge(existing)