()
| 10 | |
| 11 | |
| 12 | def main(): |
| 13 | parser = argparse.ArgumentParser(description="Fail if benchmark regressions exceed threshold") |
| 14 | parser.add_argument("--baseline", default="benchmarks/baseline_benchmarks.json") |
| 15 | parser.add_argument("--latest", default="benchmarks/latest_benchmarks.json") |
| 16 | parser.add_argument("--max-regression-pct", type=float, default=25.0) |
| 17 | parser.add_argument("--min-baseline-ms", type=float, default=0.05) |
| 18 | parser.add_argument( |
| 19 | "--overrides", |
| 20 | default=None, |
| 21 | help=( |
| 22 | "Optional JSON file mapping benchmark name -> max regression percent override " |
| 23 | "(e.g. {\"synthetic_ticker_pipeline_end_to_end\": 50.0})" |
| 24 | ), |
| 25 | ) |
| 26 | args = parser.parse_args() |
| 27 | |
| 28 | baseline = load(Path(args.baseline)) |
| 29 | latest = load(Path(args.latest)) |
| 30 | overrides = load(Path(args.overrides)) if args.overrides else {} |
| 31 | |
| 32 | base = baseline.get("benchmarks", {}) |
| 33 | curr = latest.get("benchmarks", {}) |
| 34 | |
| 35 | regressions = [] |
| 36 | checked = 0 |
| 37 | for name, b in base.items(): |
| 38 | if name not in curr: |
| 39 | continue |
| 40 | b_ms = b["mean_ms"] |
| 41 | c_ms = curr[name]["mean_ms"] |
| 42 | if b_ms < args.min_baseline_ms: |
| 43 | continue |
| 44 | checked += 1 |
| 45 | delta_pct = ((c_ms - b_ms) / b_ms) * 100.0 |
| 46 | threshold_pct = float(overrides.get(name, args.max_regression_pct)) |
| 47 | if delta_pct > threshold_pct: |
| 48 | regressions.append((name, b_ms, c_ms, delta_pct, threshold_pct)) |
| 49 | |
| 50 | print(f"checked {checked} benchmarks against baseline") |
| 51 | if regressions: |
| 52 | print("regressions above threshold:") |
| 53 | for name, b_ms, c_ms, d, t in regressions: |
| 54 | print( |
| 55 | f"- {name}: baseline={b_ms:.3f}ms latest={c_ms:.3f}ms " |
| 56 | f"delta={d:.1f}% threshold={t:.1f}%" |
| 57 | ) |
| 58 | return 1 |
| 59 | |
| 60 | print("no benchmark regressions above threshold") |
| 61 | return 0 |
| 62 | |
| 63 | |
| 64 | if __name__ == "__main__": |
no test coverage detected