Giant blob of minor changes
[dotfiles/.git] / .config / coc / extensions / coc-go-data / tools / pkg / mod / honnef.co / go / tools@v0.0.1-2020.1.5 / _benchmarks / benchmark.go
1 // +build ignore
2
3 package main
4
5 import (
6         "bytes"
7         "flag"
8         "fmt"
9         "os/exec"
10         "strings"
11 )
12
13 const theBigMerge = "0a9027c2bab9ca0d25a5db0f906fd1793774fd67"
14 const N = 10
15
16 func isAfterMerge(sha string) bool {
17         cmd := exec.Command("git", "merge-base", "--is-ancestor", theBigMerge, sha)
18         err := cmd.Run()
19         if err == nil {
20                 return true
21         }
22         _ = err.(*exec.ExitError)
23         return false
24 }
25
26 func checkout(sha string) {
27         cmd := exec.Command("git", "checkout", "-q", sha)
28         err := cmd.Run()
29         if err != nil {
30                 panic(err)
31         }
32 }
33
34 func build(tool string) {
35         err := exec.Command("go", "build", "-o", "/tmp/"+tool, "honnef.co/go/tools/cmd/"+tool).Run()
36         if err != nil {
37                 panic(err)
38         }
39 }
40
41 func run(tool, target string) (time, mem string) {
42         cmd := exec.Command("/usr/bin/time", "-f", "%e %M", "/tmp/"+tool, target)
43         out, _ := cmd.CombinedOutput()
44         lines := bytes.Split(out, []byte("\n"))
45         res := string(lines[len(lines)-2])
46         fields := strings.Split(res, " ")
47         return fields[0], fields[1]
48 }
49
50 func main() {
51         var (
52                 shas    string
53                 targets string
54                 version string
55         )
56         flag.StringVar(&shas, "shas", "HEAD", "")
57         flag.StringVar(&targets, "targets", "std", "")
58         flag.StringVar(&version, "version", "unknown", "")
59         flag.Parse()
60
61         for _, sha := range strings.Split(shas, ",") {
62                 tool := "megacheck"
63                 if isAfterMerge(sha) {
64                         tool = "staticcheck"
65                 }
66                 checkout(sha)
67                 build(tool)
68
69                 for _, target := range strings.Split(targets, ",") {
70                         for i := 0; i < N; i++ {
71                                 time, mem := run(tool, target)
72                                 fmt.Printf("%s %s %s %s %s\n", sha, version, target, time, mem)
73                         }
74                 }
75         }
76 }