84 lines
1.7 KiB
Go
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
|
|
}
|