1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
|
package main
import (
"flag"
"fmt"
"io"
"log"
"os"
"os/exec"
"path/filepath"
"strconv"
)
func init() {
log.SetOutput(os.Stderr)
log.SetFlags(log.LstdFlags | log.Lshortfile)
}
func main() {
count := flag.Int("count", 10, "Run each test and benchmark n times")
compCmd := flag.String("comp", "benchstat", "Benchmark comparison command")
flag.Parse()
if _, err := exec.LookPath(*compCmd); err != nil {
log.Fatalf("error: %v: %q\n", err, *compCmd)
}
tmpdir, err := os.MkdirTemp("", "fastwalk-bench.*")
if err != nil {
log.Fatal(err)
}
runTest := func(name string) error {
fmt.Println("##", name)
filename := filepath.Join(tmpdir, name)
f, err := os.Create(filename)
if err != nil {
log.Fatal(err)
}
defer f.Close()
args := []string{
"test",
"-run", `^$`,
"-bench", `^BenchmarkWalkComparison$`,
"-benchmem",
"-count", strconv.Itoa(*count),
"-walkfunc", name,
}
cmd := exec.Command("go", args...)
cmd.Stderr = os.Stderr
cmd.Stdout = io.MultiWriter(os.Stdout, f)
if err := cmd.Run(); err != nil {
log.Fatalf("error running command: %q: %v\n", cmd.Args, err)
}
if err := f.Close(); err != nil {
log.Fatal(err)
}
fmt.Print("\n")
return nil
}
runTest("filepath")
runTest("fastwalk")
benchStat := func(from, to string) {
fmt.Printf("## %s vs. %s\n", from, to)
cmd := exec.Command(*compCmd, from, to)
cmd.Stderr = os.Stderr
cmd.Stdout = os.Stdout
cmd.Dir = tmpdir
if err := cmd.Run(); err != nil {
log.Fatalf("error running command: %q: %v\n", cmd.Args, err)
}
fmt.Print("\n")
}
fmt.Println("## Comparisons")
fmt.Println("########################################################")
fmt.Print("\n")
benchStat("filepath", "fastwalk")
fmt.Printf("Temp: %s\n", tmpdir)
}
|