package main import ( "flag" "fmt" "log" "os" "os/exec" "path/filepath" "strings" "time" ) const ( warmup = 2 runs = 10 ) // you'll need to install all fetches :P // it's easier with nix shell btwww func main() { targetsFlag := flag.String("targets", "", "comma-separated list of commands to benchmark") flag.Parse() if *targetsFlag == "" { log.Fatal("please provide at least one target via -targets") } targets := parseTargets(*targetsFlag) dir := filepath.Join("results", time.Now().Format("2006-01-02")) if err := os.MkdirAll(dir, 0o755); err != nil { log.Fatal(err) } jsonOut := filepath.Join(dir, "results.json") mdOut := filepath.Join(dir, "results.md") args := buildArgs(targets, jsonOut, mdOut) cmd := exec.Command("hyperfine", args...) cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr fmt.Printf("benchmarking %d targets (%d warmup, %d runs each)\n", len(targets), warmup, runs) fmt.Printf("output: %s\n", dir) if err := cmd.Run(); err != nil { log.Fatalf("hyperfine: %v", err) } fmt.Printf("results written to %s\n", dir) } func parseTargets(input string) []string { parts := strings.Split(input, ",") var targets []string for _, p := range parts { p = strings.TrimSpace(p) if p != "" { targets = append(targets, p) } } return targets } func buildArgs(targets []string, jsonOut, mdOut string) []string { args := []string{ "--warmup", fmt.Sprintf("%d", warmup), "--runs", fmt.Sprintf("%d", runs), "--export-json", jsonOut, "--export-markdown", mdOut, "--ignore-failure", "--shell", "none", "--style", "full", "--sort", "mean-time", } for _, t := range targets { args = append(args, t) } return args }