We don't say fast — we show you the run. Every performance number on this stack is measured, not marketed. Here's the k6 load test that produced this one, with the full method and the raw output.
The k6 summary from the run — assignment latency, check rate, and failure rate, straight off the terminal. No post-processing.
The k6 dashboard in real time. Request rate ramps to 10,000/s and stays there; the latency line stays flat along the floor the entire time.
Not one cherry-picked number — the full percentile distribution, measured end-to-end and server-side.
| Metric | p50 | p90 | p95 | p99 | avg |
|---|---|---|---|---|---|
| Assignment latency end-to-end | 0.50 | 0.88 | 1.31 | 3.71 | 0.69 |
| Server processing excl. network | 0.47 | 0.82 | 1.22 | — | 0.65 |
This test ran 100% cold — every request was a brand-new user, forcing a full experiment assignment (segment match, deterministic bucketing, and exposure write) on the spot. That's the most expensive path the engine has.
In production it isn't the common one. Returning users are served from cache at near-zero latency, and real traffic is typically 60–80% returning — so the latency your users actually see sits well below the numbers on this page. We published the hard case on purpose.
The setup matters more than the number. Here's exactly what produced it.
| Endpoint under load | POST /v1/experiments/assign — the full experiment-assignment path: segment match, deterministic bucketing, and exposure write, all on the request. |
| Assignment path | 100% cold, new-entity — every request a first-time user drawn from a 1,000,000 pool. No pre-warmed cache doing the easy work. |
| Server | Single AWS c6i.xlarge (4 vCPU) running the API, worker, Postgres, and a two-instance Redis topology under Docker Compose. |
| Load generator | Separate c6i instance running k6, ramping arrival rate 500 → 10,000 req/s over the private network. |
| Volume | 3,846,561 assignments served in the measured window; 7.69M checks, all passed. |
| Evaluation model | In-process, in-memory config cache — assignment resolves with zero network calls off the request path. |
One honest note on the number: 10K is the sustained plateau, measured across the five-minute hold. The whole-window average is lower (~8K/s) because it folds in the ramp-up and cool-down — arithmetic, not a ceiling. At 1.3 ms p95 on a single 4-vCPU box, the server had headroom to spare; the number scales with the hardware behind it.