sysbench/cmd/bench/main.go
2026-04-02 20:08:25 +02:00

84 lines
1.7 KiB
Go

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
}