...
1
16
17 package main
18
19 import (
20 "bytes"
21 "encoding/json"
22 "fmt"
23 "os"
24
25 benchparse "golang.org/x/tools/benchmark/parse"
26 )
27
28
29
30
31
32
33
34
35 type DataItem struct {
36
37
38 Data map[string]float64 `json:"data"`
39
40
41 Unit string `json:"unit"`
42
43 Labels map[string]string `json:"labels,omitempty"`
44 }
45
46
47 type PerfData struct {
48
49
50 Version string `json:"version"`
51 DataItems []DataItem `json:"dataItems"`
52
53 Labels map[string]string `json:"labels,omitempty"`
54 }
55
56 func main() {
57 err := run()
58 if err != nil {
59 panic(err)
60 }
61 }
62
63 func run() error {
64 if len(os.Args) < 2 {
65 return fmt.Errorf("output filename is a required argument")
66 }
67 benchmarkSet, err := benchparse.ParseSet(os.Stdin)
68 if err != nil {
69 return err
70 }
71 data := PerfData{Version: "v1"}
72 for _, benchMarks := range benchmarkSet {
73 for _, benchMark := range benchMarks {
74 data.DataItems = appendIfMeasured(data.DataItems, benchMark, benchparse.NsPerOp, "time", "μs", benchMark.NsPerOp/1000.0)
75 data.DataItems = appendIfMeasured(data.DataItems, benchMark, benchparse.MBPerS, "throughput", "MBps", benchMark.MBPerS)
76 data.DataItems = appendIfMeasured(data.DataItems, benchMark, benchparse.AllocedBytesPerOp, "allocated", "bytes", float64(benchMark.AllocedBytesPerOp))
77 data.DataItems = appendIfMeasured(data.DataItems, benchMark, benchparse.AllocsPerOp, "allocations", "1", float64(benchMark.AllocsPerOp))
78 data.DataItems = appendIfMeasured(data.DataItems, benchMark, 0, "iterations", "1", float64(benchMark.N))
79 }
80 }
81 output := &bytes.Buffer{}
82 if err := json.NewEncoder(output).Encode(data); err != nil {
83 return err
84 }
85 formatted := &bytes.Buffer{}
86 if err := json.Indent(formatted, output.Bytes(), "", " "); err != nil {
87 return err
88 }
89 return os.WriteFile(os.Args[1], formatted.Bytes(), 0664)
90 }
91
92 func appendIfMeasured(items []DataItem, benchmark *benchparse.Benchmark, metricType int, metricName string, unit string, value float64) []DataItem {
93 if metricType != 0 && (benchmark.Measured&metricType) == 0 {
94 return items
95 }
96 return append(items, DataItem{
97 Unit: unit,
98 Labels: map[string]string{
99 "benchmark": benchmark.Name,
100 "metricName": metricName},
101 Data: map[string]float64{
102 "value": value}})
103 }
104
View as plain text