Don't copy nodes in Reduce merge

Since we know the object is not accessible anywhere else in the
program, we can use an 'unsafe' destructive merge.
This commit is contained in:
Bryan Boreham
2018-04-14 22:15:50 +00:00
parent b8dae7768d
commit a81616ab5e
2 changed files with 20 additions and 6 deletions

View File

@@ -23,11 +23,9 @@ type Nodes struct {
}
// Merge merges the results of Rendering
func (r Nodes) Merge(o Nodes) Nodes {
return Nodes{
Nodes: r.Nodes.Merge(o.Nodes),
Filtered: r.Filtered + o.Filtered,
}
func (r *Nodes) UnsafeMerge(o Nodes) {
r.Nodes = r.Nodes.UnsafeMerge(o.Nodes)
r.Filtered = r.Filtered + o.Filtered
}
// Transformer is something that transforms one set of Nodes to
@@ -78,7 +76,8 @@ func (r Reduce) Render(rpt report.Report) Nodes {
for ; l > 1; l-- {
left, right := <-c, <-c
go func() {
c <- left.Merge(right)
left.UnsafeMerge(right)
c <- left
}()
}
return <-c

View File

@@ -196,6 +196,21 @@ func (n Nodes) Merge(other Nodes) Nodes {
return cp
}
// UnsafeMerge merges two Nodes objects, altering the larger, and returning the combined set
func (n Nodes) UnsafeMerge(other Nodes) Nodes {
if len(other) > len(n) {
n, other = other, n
}
for k, v := range other {
if existing, ok := n[k]; ok { // don't overwrite
n[k] = v.Merge(existing)
} else {
n[k] = v
}
}
return n
}
// Validate checks the topology for various inconsistencies.
func (t Topology) Validate() error {
errs := []string{}