diff --git a/README.md b/README.md index 5f8bc2b..c451470 100644 --- a/README.md +++ b/README.md @@ -60,6 +60,8 @@ benchgraph -help Usage of benchgraph: -apiurl string url to server api (default "http://benchgraph.codingberg.com") + -local + generates the response locally -oba value comma-separated list of benchmark arguments (default []) -obn value @@ -85,6 +87,17 @@ cat out|benchgraph -title="Graph1: Benchmark F(x) in ns/op" -obn="F2,F3,F4" -oba cat out|benchgraph -title="Graph2: Benchmark F(x) in ns/op" -obn="F2,F3,F4" -oba="0F,F0,F00,F000,F0000,F00000,F000000,F0000000" ``` +To have all in local, you can also use the **-local** option : + +```bash +go test -bench . > out + +cat out|benchgraph -title="Graph1: Benchmark F(x) in ns/op" -obn="F2,F3,F4" -oba="F,FF,FFF,FFFF,FFFFF,FFFFFF,FFFFFFF,FFFFFFFF" -local +cat out|benchgraph -title="Graph2: Benchmark F(x) in ns/op" -obn="F2,F3,F4" -oba="0F,F0,F00,F000,F0000,F00000,F000000,F0000000" -local +``` + +It will generates on your temp folder, a local html file. + ## Online Demo Here we analyze efficiency of different algorithms for computing parity of uint64 numbers: diff --git a/main.go b/main.go index 1a3ddb6..ea684fb 100644 --- a/main.go +++ b/main.go @@ -9,6 +9,7 @@ import ( "net/http" "net/url" "os" + "text/template" "github.com/fatih/color" "golang.org/x/tools/benchmark/parse" @@ -35,6 +36,41 @@ func uploadData(apiUrl, data, title string) (string, error) { return string(body), nil } +func writeLocallyData(data, title string) (string, error) { + t := template.New("Benchgraph Template") + t, err := t.Parse(templateHTML) + if err != nil { + return "", err + } + + tmpfile, err := ioutil.TempFile("", "benchgraph") + if err != nil { + return "", err + } + + model := struct { + Title, Data string + }{ + title, + data, + } + + err = t.Execute(tmpfile, model) + if err != nil { + return "", err + } + + tmpfile.Close() + newName := fmt.Sprintf("%s.html", tmpfile.Name()) + err = os.Rename(tmpfile.Name(), newName) + if err != nil { + newName = tmpfile.Name() + } + + return newName, nil + +} + func main() { var oBenchNames, oBenchArgs stringList @@ -44,6 +80,7 @@ func main() { flag.Var(&oBenchArgs, "oba", "comma-separated list of benchmark arguments") title := flag.String("title", "Graph: Benchmark results in ns/op", "title of a graph") apiUrl := flag.String("apiurl", "http://benchgraph.codingberg.com", "url to server api") + islocal := flag.Bool("local", false, "generates the response locally") flag.Parse() var skipBenchNamesParsing, skipBenchArgsParsing bool @@ -109,11 +146,18 @@ func main() { } fmt.Println() - fmt.Println("Waiting for server response ...") data := graphData(benchResults, oBenchNames, oBenchArgs) - graphUrl, err := uploadData(*apiUrl, string(data), *title) + var graphUrl string + var err error + if !*islocal { + fmt.Println("Waiting for server response ...") + graphUrl, err = uploadData(*apiUrl, string(data), *title) + } else { + graphUrl, err = writeLocallyData(string(data), *title) + } + if err != nil { fmt.Fprintf(os.Stderr, "uploading data: %v", err) os.Exit(1) diff --git a/template.go b/template.go new file mode 100644 index 0000000..982ab36 --- /dev/null +++ b/template.go @@ -0,0 +1,58 @@ +package main + +var templateHTML = ` + +
+ + +