End-to-end latency hides the shape of a streamed answer. A 9 second response that starts at 400 ms feels broken in one case and fine in another, and the difference sits entirely in where the time goes. The standard decomposition is well known: end-to-end latency is approximately time to first token plus remaining generation time, which serving teams already publish as TTFT and time per output token in NVIDIA's benchmarking documentation. The same split appears as TTFT + (output tokens − 1) × TPOT in ClickHouse's latency guide.
Two adjustments make that model usable for a product owner rather than an inference engineer. First, measure chunks, not tokens: chunk boundaries are what the browser actually renders, and SSE delivers them as discrete events dispatched on a blank line per this SSE guide. Second, report the gap as a percentile, not a mean. Average inter-token latency weighted per request and the same figure weighted per token give different answers, and the token-weighted version hides short requests that stalled as Anyscale documents.
Here is the decision rule that makes the scorecard actionable:
| Metric fails p95 budget | What it usually means | First thing to fix |
|---|---|---|
| First chunk | Prefill, queueing, or proxy buffering before the stream opens | Cap prompt size, check queue depth, disable response buffering at the edge |
| Gap | Steady-state decode speed or a mid-stream stall | Batch size, model tier, retry storms from a provider |
| Tail | Output length, not speed | Cap max tokens, split long answers, render progressive structure |
The insight most dashboards miss: tail is a product decision more than an infrastructure one. If the 95th percentile tail is 14 seconds but the 95th percentile gap is 40 ms, the model is streaming fast and the answer is simply too long. Adding accelerators will not move that number. Capping length or streaming partial structure will. This write-up on incremental JSON parsing makes the same point from the client side: users tolerate a long answer that visibly fills in far better than a spinner, because the perceived improvement from progressive rendering runs far ahead of any real speedup.



