"""End-to-end router latency (tokenize + route + Core ML predict + decode) per bucket, from Python. uv run python bench/router_latency.py """ import statistics import sys import time import warnings from pathlib import Path warnings.filterwarnings("ignore") sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "tests")) from cases import CASES # noqa: E402 from gliner_decide_coreml import DecideRouter # noqa: E402 router = DecideRouter() seen = set() print(f"{'case':<28}{'tokens':>7}{'bucket':>8}{'p50':>10}{'p90':>10}") for case in CASES: if case["bucket"] in seen: continue seen.add(case["bucket"]) for _ in range(5): router.classify(case["text"], case["tasks"]) times = [] for _ in range(30): start = time.perf_counter() _, route = router.classify_with_route(case["text"], case["tasks"]) times.append((time.perf_counter() - start) * 1000) times.sort() print(f"{case['id']:<28}{route.tokens:>7}{route.bucket:>8}{statistics.median(times):>8.1f}ms" f"{times[int(len(times) * 0.9)]:>8.1f}ms")