Remove slower mergers

This commit is contained in:
Bryan Boreham
2018-06-22 10:47:00 +00:00
parent 126a171f62
commit 3309d09ad8
3 changed files with 2 additions and 58 deletions

View File

@@ -75,7 +75,7 @@ func BenchmarkReportMerge(b *testing.B) {
func getReport(b *testing.B) report.Report {
r := fixture.Report
if *benchReportPath != "" {
r = NewSmartMerger().Merge(upgradeReports(readReportFiles(b, *benchReportPath)))
r = NewFastMerger().Merge(upgradeReports(readReportFiles(b, *benchReportPath)))
}
return r
}

View File

@@ -13,54 +13,6 @@ type Merger interface {
Merge([]report.Report) report.Report
}
type dumbMerger struct{}
// MakeDumbMerger makes a Merger which merges together reports in the simplest possible way.
func MakeDumbMerger() Merger {
return dumbMerger{}
}
func (dumbMerger) Merge(reports []report.Report) report.Report {
rpt := report.MakeReport()
id := murmur3.New64()
for _, r := range reports {
rpt = rpt.Merge(r)
id.Write([]byte(r.ID))
}
rpt.ID = fmt.Sprintf("%x", id.Sum64())
return rpt
}
type smartMerger struct{}
// NewSmartMerger makes a Merger which merges reports in
// parallel. Speed up comes from the fact that a) most merges are
// between small reports, and b) we take advantage of available cores.
func NewSmartMerger() Merger {
return smartMerger{}
}
func (smartMerger) Merge(reports []report.Report) report.Report {
l := len(reports)
switch l {
case 0:
return report.MakeReport()
case 1:
return reports[0]
}
c := make(chan report.Report, l)
for _, r := range reports {
c <- r
}
for ; l > 1; l-- {
left, right := <-c, <-c
go func() {
c <- left.Merge(right)
}()
}
return <-c
}
type fastMerger struct{}
// NewFastMerger makes a Merger which merges together reports, mutating the one we are building up

View File

@@ -27,7 +27,7 @@ func TestMerger(t *testing.T) {
want.Endpoint.AddNode(report.MakeNode("bar"))
want.Endpoint.AddNode(report.MakeNode("baz"))
for _, merger := range []app.Merger{app.MakeDumbMerger(), app.NewSmartMerger()} {
for _, merger := range []app.Merger{app.NewFastMerger()} {
// Test the empty list case
if have := merger.Merge([]report.Report{}); !reflect.DeepEqual(have, report.MakeReport()) {
t.Errorf("Bad merge: %s", test.Diff(have, want))
@@ -44,14 +44,6 @@ func TestMerger(t *testing.T) {
}
}
func BenchmarkSmartMerger(b *testing.B) {
benchmarkMerger(b, app.NewSmartMerger())
}
func BenchmarkDumbMerger(b *testing.B) {
benchmarkMerger(b, app.MakeDumbMerger())
}
func BenchmarkFastMerger(b *testing.B) {
benchmarkMerger(b, app.NewFastMerger())
}