#!/usr/bin/env python3 """Aggregate equally sized benchmark trials from the recorded Ubuntu 24.04 runs.""" import json import statistics from pathlib import Path root = Path(__file__).resolve().parent raw = root / "raw" groups = { "gate": { "old": ["old-gate.json", "old-gate2.json"], "new": ["new-gate.json", "new-gate2.json"], }, "db": { "old": ["old-db.json", "old-db2.json", "old-db3.json"], "new": ["new-db.json", "new-db2.json", "new-db3.json"], }, "incidents": { "old": ["old-incidents.json", "old-incidents2.json"], "new": ["new-incidents.json", "new-incidents2.json"], }, "internal": { "old": ["old.json", "old2.json"], "new": ["new.json", "new2.json"], }, } def collect(files): cases = {} for name in files: document = json.loads((raw / name).read_text()) for case, record in document["cases"].items(): trials = record if isinstance(record, list) else record["trials"] iterations = document.get("samples_per_trial", record.get("iterations_per_trial") if isinstance(record, dict) else None) if iterations is None: raise ValueError(f"Missing iteration count in {name}:{case}") entry = cases.setdefault(case, {"iterations_per_trial": iterations, "trials": []}) if entry["iterations_per_trial"] != iterations: raise ValueError(f"Iteration count drift in {name}:{case}") entry["trials"].extend(trials) return cases def summarize(entry, group): trials = entry["trials"] result = { "trial_count": len(trials), "samples": len(trials) * entry["iterations_per_trial"], "mean_ms": statistics.mean(t["mean_ms"] for t in trials), "median_ms": statistics.median(t["median_ms"] for t in trials), "median_trial_p95_ms": statistics.median(t["p95_ms"] for t in trials), "max_ms": max(t["max_ms"] for t in trials), } if "queries_min" in trials[0]: result["queries_min"] = min(t["queries_min"] for t in trials) result["queries_max"] = max(t["queries_max"] for t in trials) elif group == "gate": result["queries_min"] = result["queries_max"] = 1 return result summary = { "before_revision": "b9affcc8601eca978f28c640e62e305d487b6ef0", "after_revision": "d899eef4aad5e50e1297c66c130af5e85de28394", "environment": "Ubuntu 24.04.4 VM 96276; PHP 8.4.26; MariaDB 10.11.14", "units": "milliseconds per treatment", "groups": {}, } for group, versions in groups.items(): old = collect(versions["old"]) new = collect(versions["new"]) if set(old) != set(new): raise ValueError(f"Case mismatch in {group}") values = {} for case in old: before = summarize(old[case], group) after = summarize(new[case], group) if before["samples"] != after["samples"]: raise ValueError(f"Sample mismatch in {group}:{case}") values[case] = { "before": before, "after": after, "median_delta_percent": (after["median_ms"] / before["median_ms"] - 1) * 100, } summary["groups"][group] = values (root / "comparison.json").write_text(json.dumps(summary, ensure_ascii=False, indent=2) + "\n") print(f"Wrote {root / 'comparison.json'} with {sum(map(len, summary['groups'].values()))} cases")