diff --git a/app/benchmark_internal_test.go b/app/benchmark_internal_test.go index 8f6b7ba4c..b689e6765 100644 --- a/app/benchmark_internal_test.go +++ b/app/benchmark_internal_test.go @@ -9,6 +9,7 @@ import ( "testing" "github.com/weaveworks/scope/render" + "github.com/weaveworks/scope/render/detailed" "github.com/weaveworks/scope/report" "github.com/weaveworks/scope/test/fixture" ) @@ -17,7 +18,7 @@ var ( benchReportPath = flag.String("bench-report-path", "", "report file, or dir with files, to use for benchmarking (relative to this package)") ) -func readReportFiles(path string) ([]report.Report, error) { +func readReportFiles(b *testing.B, path string) []report.Report { reports := []report.Report{} if err := filepath.Walk(path, func(p string, info os.FileInfo, err error) error { @@ -34,69 +35,54 @@ func readReportFiles(path string) ([]report.Report, error) { reports = append(reports, rpt) return nil }); err != nil { - return nil, err + b.Fatal(err) } - return reports, nil + return reports } func BenchmarkReportUnmarshal(b *testing.B) { b.ResetTimer() for i := 0; i < b.N; i++ { - if _, err := readReportFiles(*benchReportPath); err != nil { - b.Fatal(err) - } + readReportFiles(b, *benchReportPath) + } +} + +func upgradeReports(reports []report.Report) []report.Report { + upgraded := make([]report.Report, len(reports)) + for i, r := range reports { + upgraded[i] = r.Upgrade() + } + return upgraded +} + +func BenchmarkReportUpgrade(b *testing.B) { + reports := readReportFiles(b, *benchReportPath) + b.ResetTimer() + for i := 0; i < b.N; i++ { + upgradeReports(reports) } } func BenchmarkReportMerge(b *testing.B) { - reports, err := readReportFiles(*benchReportPath) - if err != nil { - b.Fatal(err) - } + reports := upgradeReports(readReportFiles(b, *benchReportPath)) merger := NewSmartMerger() - b.ResetTimer() - for i := 0; i < b.N; i++ { merger.Merge(reports) } } -func BenchmarkReportUpgrade(b *testing.B) { - reports, err := readReportFiles(*benchReportPath) - if err != nil { - b.Fatal(err) +func getReport(b *testing.B) report.Report { + r := fixture.Report + if *benchReportPath != "" { + r = NewSmartMerger().Merge(upgradeReports(readReportFiles(b, *benchReportPath))) } - r := NewSmartMerger().Merge(reports) - - b.ResetTimer() - - for i := 0; i < b.N; i++ { - r.Upgrade() - } -} - -func BenchmarkTopologyList(b *testing.B) { - benchmarkRender(b, func(report report.Report) { - request := &http.Request{ - Form: url.Values{}, - } - topologyRegistry.renderTopologies(report, request) - }) + return r } func benchmarkRender(b *testing.B, f func(report.Report)) { - r := fixture.Report - if *benchReportPath != "" { - reports, err := readReportFiles(*benchReportPath) - if err != nil { - b.Fatal(err) - } - r = NewSmartMerger().Merge(reports) - } - + r := getReport(b) b.ResetTimer() - for i := 0; i < b.N; i++ { b.StopTimer() render.ResetCache() @@ -105,32 +91,72 @@ func benchmarkRender(b *testing.B, f func(report.Report)) { } } -func BenchmarkTopologyHosts(b *testing.B) { - benchmarkOneTopology(b, "hosts") +func renderForTopology(b *testing.B, topologyID string, report report.Report) report.Nodes { + renderer, filter, err := topologyRegistry.RendererForTopology(topologyID, url.Values{}, report) + if err != nil { + b.Fatal(err) + } + return render.Render(report, renderer, filter).Nodes } -func BenchmarkTopologyControllers(b *testing.B) { - benchmarkOneTopology(b, "kube-controllers") -} - -func BenchmarkTopologyPods(b *testing.B) { - benchmarkOneTopology(b, "pods") -} - -func BenchmarkTopologyContainers(b *testing.B) { - benchmarkOneTopology(b, "containers") -} - -func BenchmarkTopologyProcesses(b *testing.B) { - benchmarkOneTopology(b, "processes") -} - -func benchmarkOneTopology(b *testing.B, topologyID string) { +func benchmarkRenderTopology(b *testing.B, topologyID string) { benchmarkRender(b, func(report report.Report) { - renderer, filter, err := topologyRegistry.RendererForTopology(topologyID, url.Values{}, report) - if err != nil { - b.Fatal(err) - } - render.Render(report, renderer, filter) + renderForTopology(b, topologyID, report) }) } + +func BenchmarkRenderList(b *testing.B) { + benchmarkRender(b, func(report report.Report) { + topologyRegistry.renderTopologies(report, &http.Request{Form: url.Values{}}) + }) +} + +func BenchmarkRenderHosts(b *testing.B) { + benchmarkRenderTopology(b, "hosts") +} + +func BenchmarkRenderControllers(b *testing.B) { + benchmarkRenderTopology(b, "kube-controllers") +} + +func BenchmarkRenderPods(b *testing.B) { + benchmarkRenderTopology(b, "pods") +} + +func BenchmarkRenderContainers(b *testing.B) { + benchmarkRenderTopology(b, "containers") +} + +func BenchmarkRenderProcesses(b *testing.B) { + benchmarkRenderTopology(b, "processes") +} + +func benchmarkSummarizeTopology(b *testing.B, topologyID string) { + r := getReport(b) + rc := report.RenderContext{Report: r} + nodes := renderForTopology(b, topologyID, r) + b.ResetTimer() + for i := 0; i < b.N; i++ { + detailed.Summaries(rc, nodes) + } +} + +func BenchmarkSummarizeHosts(b *testing.B) { + benchmarkSummarizeTopology(b, "hosts") +} + +func BenchmarkSummarizeControllers(b *testing.B) { + benchmarkSummarizeTopology(b, "kube-controllers") +} + +func BenchmarkSummarizePods(b *testing.B) { + benchmarkSummarizeTopology(b, "pods") +} + +func BenchmarkSummarizeContainers(b *testing.B) { + benchmarkSummarizeTopology(b, "containers") +} + +func BenchmarkSummarizeProcesses(b *testing.B) { + benchmarkSummarizeTopology(b, "processes") +}