blob: 6426ff461f4bdb00e8bf3ba713efbd79976e0e1d [file] [log] [blame]
Shinichiro Hamajib69bf8a2015-06-10 14:52:06 +09001// Copyright 2015 Google Inc. All rights reserved
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
Fumitoshi Ukai8f60f062015-04-10 23:09:33 +090015/*
16Program parse_benchcmp runs testcase_parse_benchmark and displays
17performance changes.
18
19*/
20package main
21
22import (
23 "fmt"
24 "os"
25 "os/exec"
26 "strings"
27)
28
29func run(prog string, args ...string) {
30 cmd := exec.Command(prog, args...)
31 cmd.Stdout = os.Stdout
32 cmd.Stderr = os.Stderr
33 err := cmd.Run()
34 if err != nil {
35 panic(err)
36 }
37}
38
39func output(prog string, args ...string) string {
40 cmd := exec.Command(prog, args...)
41 out, err := cmd.CombinedOutput()
42 if err != nil {
43 panic(err)
44 }
45 return strings.TrimSpace(string(out))
46}
47
48func runBenchtest(fname string) {
49 run("go", "generate")
50 f, err := os.Create(fname)
51 if err != nil {
52 panic(err)
53 }
54 defer func() {
55 err = f.Close()
56 if err != nil {
57 panic(err)
58 }
59 }()
60 cmd := exec.Command("go", "test", "-run", "NONE", "-bench", ".")
61 cmd.Stdout = f
62 err = cmd.Run()
63 if err != nil {
64 panic(err)
65 }
66}
67
68func main() {
69 _, err := exec.LookPath("benchcmp")
70 if err != nil {
71 fmt.Fprintln(os.Stderr, "benchcmp not found:", err)
72 fmt.Fprintln(os.Stderr, "install it by:")
73 fmt.Fprintln(os.Stderr, " export GOPATH=$HOME # if not set")
74 fmt.Fprintln(os.Stderr, " PATH=$PATH:$GOPATH/bin")
75 fmt.Fprintln(os.Stderr, " go get -u golang.org/x/tools/cmd/benchcmp")
76 os.Exit(1)
77 }
78 status := output("git", "status", "-s")
79 if status != "" {
80 fmt.Fprintln(os.Stderr, "workspace is dirty. please commit.")
81 fmt.Fprintln(os.Stderr, status)
82 os.Exit(1)
83 }
84 curBranch := output("git", "symbolic-ref", "--short", "HEAD")
85 if curBranch == "master" {
86 fmt.Fprintln(os.Stderr, "current branch is master.")
87 fmt.Fprintln(os.Stderr, "run in branch to compare with master.")
88 os.Exit(1)
89 }
90 fmt.Println("Run benchmark on master and ", curBranch)
91 fmt.Println("git checkout master")
92 run("git", "checkout", "master")
93 run("git", "clean", "-f")
94 commit := output("git", "log", "--oneline", "-1")
95 fmt.Println(commit)
96 fmt.Println("running benchmark tests...")
97 runBenchtest("bench-old.out")
98
99 fmt.Println("git checkout", curBranch)
100 run("git", "checkout", curBranch)
101 run("git", "clean", "-f")
102 commit = output("git", "log", "--oneline", "-1")
103 fmt.Println(commit)
104 fmt.Println("running benchmark tests...")
105 runBenchtest("bench-new.out")
106
107 run("benchcmp", "bench-old.out", "bench-new.out")
108}