Two bottlenecks live inside one request. The pause you feel is prefill. The speed you feel afterwards is decode. Fixing one does nothing for the other — and one popular fix makes the pause worse on purpose.
Time to first token (TTFT) is the latency from sending a request to receiving the first streamed token. It is dominated by prefill: the single pass in which the model processes every prompt token in parallel and fills the key-value cache (KV cache). Everything after that first token is decode — one token at a time — and it is measured by a different number entirely, inter-token latency (ITL).
So “the model is slow” is not one claim, it is two. Prefill is compute-bound and scales with prompt length, so a longer prompt lengthens the silence before anything appears. Decode is memory-bandwidth-bound, so it sets how fast words then stream in. Same request, opposite limiting resources.
One parallel pass over all prompt tokens; builds the KV cache. Compute-bound. Its cost grows with prompt length — this is the wait.
Generates one token per step, reusing the KV cache. Memory-bandwidth-bound. Reported as inter-token latency, not as TTFT.
A repeated system prompt is prefilled once and reused across requests, so its tokens stop being paid for on every call.
Packs many requests through the GPU together. Raises throughput; your request now waits in a batch, so TTFT gets worse.
| Prefill / TTFT | Decode / ITL | |
|---|---|---|
| What it measures | Request → first token | Gap between later tokens |
| Bound by | Compute | Memory bandwidth |
| Grows with | Prompt length | Model size, cache size |
| Fixed by | Shorter prompt, prefix cache | Quantisation, batching |
| Batching effect | Worse | Better per-GPU throughput |
The classic error is optimising the wrong half. Enable continuous batching and your dashboard improves: tokens per second up, GPUs better utilised, cost per token down. Meanwhile every individual user waits longer for the first word, because their request now queues behind others in the batch. A serving change can raise throughput and degrade the felt experience simultaneously.
The test: report the 99th percentile of both TTFT and inter-token latency — never the mean of one. A mean hides the queueing tail that batching creates, and a single metric cannot show a trade-off. If a change claims a win and you only have one number, you have not measured it.