The useful part, up front

What you’ll take away

  • First-token delay, streaming gaps and completion time describe different parts of an answer.
  • An average over requests can differ from an average over every observed gap.
  • Bundled output separates the count of stream events from the count of generated tokens.
  • A one-token response has no later-token interval; zero and exclusion are reporting choices.
  • Client arrival timestamps alone cannot identify the server phase or screen delay that caused a pause.
01

The first word, the next word and the finished answer

An assistant can start answering quickly and then stop moving for an uncomfortable stretch. Another can take longer to begin, but deliver the rest in a steady rhythm. If both finish at the same moment, a single total-time number hides much of what the reader experienced. A first-response number hides a different part of the story.

We will follow five invented requests using exact arrival times for their streamed output. The first three let us compare response speed and averaging. A fourth delivers several tokens in one event. The fifth produces only one token. Every timestamp is constructed for this explanation; no model, server or internet connection was benchmarked.

The distinction has a practical counterpart in vLLM’s version 0.31.0 documentation, which separates first output, gaps between outputs and average time per later output token [1]. These measurements answer different questions. Before deciding that one assistant is faster, identify which part of the wait matters and what was actually timed. The same trace can support several correct numbers without those numbers being interchangeable.

A starts sooner, but its last gap is much longer. Original one-token-per-event fixtures. A arrives at 100,150,200,250,700 ms; B arrives at 300,400,500,600,700 ms.
Original one-token-per-event fixtures. A arrives at 100,150,200,250,700 ms; B arrives at 300,400,500,600,700 ms. · Ameer Journal — original explanatory diagramOriginal editorial illustration; no third-party artwork reused.
02

A client timer sees only its own part of the journey

Start our timer when the client sends a request. Record when that same client receives each content event and when the request finishes. The first-token time is the first event’s arrival minus the send time. Total response time runs from sending to completion. A gap is the difference between two consecutive event arrivals.

These boundaries leave some things unknown. The records do not say when a person clicked a button, when text first appeared on a screen, or when the server began computing. A browser could receive content before showing it. A client could also hold work before sending it. Those would require additional timestamps, rather than being silently included in the numbers we already have.

The vLLM benchmark documentation explicitly distinguishes waiting for a client concurrency limit from its ordinary request timing [1]. That distinction is useful even without using the tool: name the starting event. Our examples begin at sending, use one consistent timing basis within each request, and contain no recorded wait before sending. They cannot tell us whether such a wait occurred elsewhere.

03

Two answers finish together but stream differently

Request A delivers its five tokens at 100, 150, 200, 250 and 700 milliseconds. Request B delivers five tokens at 300, 400, 500, 600 and 700 milliseconds. Each list is measured from that request’s own send time. Both requests therefore finish after 700 milliseconds and produce the same declared number of tokens.

A starts 200 milliseconds sooner. Its first three gaps are only 50 milliseconds each, but its final gap is 450 milliseconds. B begins later and then has four equal gaps of 100 milliseconds. The smaller first-response time belongs to A; the smaller largest pause belongs to B. Neither distinction changes the equal finishing time.

Imagine a reader seeing each event immediately. A would appear responsive at first and then pause, while B would begin later and continue steadily. That is an interpretation of the arrival pattern, not a measured user study. The actual screen experience could differ if the interface groups or delays updates. The records establish arrival timing; they do not reveal why A’s long gap happened.

04

Average the part after the first token carefully

For requests that produce more than one token, the documented per-request calculation subtracts first-token time from total time, then divides by the number of later tokens [1]. A has 600 milliseconds after its first arrival and four later tokens. Its result is 150 milliseconds per later token. B has 400 milliseconds after its first arrival and the same four later tokens, giving 100 milliseconds.

A’s average of 150 does not mean that each pause lasted 150. Its actual pauses were 50, 50, 50 and 450. The average combines them and loses their order. B’s average happens to equal every gap because we deliberately made its spacing uniform. An average alone cannot tell us which of these patterns occurred.

Add request C, which delivers two tokens at 500 and 700 milliseconds. It starts later than A or B, finishes after the same 700 milliseconds, and has one later-token gap of 200 milliseconds. We now have three per-request averages: 150, 100 and 200. The next question is how to combine them without changing what each observation represents.

Changing the averaging unit changes the result. Original A/B/C arithmetic. Request means give each request one vote; pooled gaps give each interval one vote.
Original A/B/C arithmetic. Request means give each request one vote; pooled gaps give each interval one vote. · Ameer Journal — original explanatory diagramOriginal editorial illustration; no third-party artwork reused.
05

One vote per request differs from one vote per gap

Give each of A, B and C one equal vote. Their average time-per-token values are 150, 100 and 200 milliseconds. Adding those three numbers and dividing by three gives 150 milliseconds. That answers a question about the average of the three request-level values.

Now combine every observed gap. A contributes four gaps totaling 600 milliseconds. B contributes four totaling 400. C contributes one totaling 200. There are nine gaps with a combined duration of 1,200 milliseconds, so the average gap is about 133.33 milliseconds. C has one vote in this calculation, while A and B each have four.

Neither result is an arithmetic mistake. They count observations differently. The vLLM documents distinguish statistics over streamed-output gaps from statistics over one calculated value per request [1][2]. A report that says only average token time leaves that choice unclear. Preserve the unit being averaged: a request or a gap. Our three-request set is deliberately small, so neither result estimates a wider population or proves how a service will behave under load.

06

A correct per-request equation can fail after careless averaging

For each of our first three requests, total time equals first-token time plus the time after the first token. That last part also equals the number of later tokens multiplied by the request’s average time per later token. The equation works exactly for A, B and C.

It is tempting to insert three separate averages into it. Mean first-token time is 300 milliseconds, mean token count is four, and mean per-request token time is 150 milliseconds. The calculation becomes 300 plus three times 150, or 750 milliseconds. But every request actually finishes after 700 milliseconds, so their average completion time must also be 700.

The mistake is separating quantities that belong to the same request. A and B each contribute four later tokens; C contributes one. Instead, calculate the after-first duration for each request: 600, 400 and 200 milliseconds. Their average is 400. Add the mean first-token time of 300, and the correct mean completion time is 700. Keep the paired counts and durations together before averaging.

07

An arriving chunk can contain several tokens

Request D has content events at 100, 220 and 400 milliseconds. The first contains one token, the second contains three and the last contains one. That makes five output tokens in three observed events. Its two visible gaps are 120 and 180 milliseconds, with an average of 150 milliseconds between events.

The per-request token calculation gives a different number. There are 300 milliseconds between the first arrival and completion, and four later tokens. Dividing 300 by four gives 75 milliseconds per later token. The gap average of 150 and the token average of 75 both follow from the same trace.

The middle event does not tell us exactly when its three tokens were generated. We know when the bundle arrived. We should not create extra zero-length arrival gaps and pretend those were separate observations. The vLLM benchmark guide makes this distinction for outputs that bundle tokens, including speculative decoding [1]. Our bundle is simply declared; it does not prove that speculative decoding or any other particular mechanism produced it.

Keep each token count paired with its own duration. Original A/B/C derivation. The per-request identity is valid; multiplying separate averages does not preserve its product term.
Original A/B/C derivation. The per-request identity is valid; multiplying separate averages does not preserve its product term. · Ameer Journal — original explanatory diagramOriginal editorial illustration; no third-party artwork reused.
08

The same metric name can hide another normalization

A second documented calculation adds another useful comparison. NVIDIA’s GenAI-Perf README defines its inter-token value using the gap before a response divided by the number of generated tokens in that later response [3]. Apply that rule manually to D. The 120-millisecond gap is followed by three tokens, giving 40 milliseconds per token. The 180-millisecond gap is followed by one token, giving 180.

The ordinary average of those two response-level values is 110 milliseconds. We now have three answers for D: 150 between observed events, 75 from its whole post-first-token duration, and 110 from averaging the two normalized response values. Each result has a different denominator or weighting rule.

This is a comparison of written definitions, not a run of either tool. The NVIDIA README also says GenAI-Perf is being phased out [3], so its presence here should not be read as a current tool recommendation. When comparing an existing report with a new one, retain the tool version, formula and sample unit. Matching labels alone cannot establish that the reported numbers measure the same quantity.

09

One token leaves no later-token interval to average

Request E sends its only token at 90 milliseconds and completes at that same time. Its first-token time and total time are both 90 milliseconds. There is no gap between two token events because a second event never occurs.

Trying the later-token formula produces zero divided by zero: no elapsed time after the first token, divided by no later tokens. That has no defined mathematical value. It does not establish that the server generates tokens instantaneously. It tells us that this request supplies no later-token interval for the measurement we chose.

The vLLM version 0.31.0 metrics documentation records an implementation difference: its server histogram uses zero for requests with no more than one generated token, while its benchmark excludes those requests from its token-time statistics [2]. Such handling affects a summary’s population. We keep E separate from the three-request averages above and report why. A displayed zero, an absent value and an excluded observation should not be assumed to mean the same thing.

One bundled trace gives three differently defined averages. Original D events: 100 ms/1 token, 220 ms/3 tokens, 400 ms/1 token. Definitions are applied manually; neither benchmark tool was run.
Original D events: 100 ms/1 token, 220 ms/3 tokens, 400 ms/1 token. Definitions are applied manually; neither benchmark tool was run. · Ameer Journal — original explanatory diagramOriginal editorial illustration; no third-party artwork reused.
10

Declare the experience you want before counting successes

For this exercise only, invent two requirements: the first token must arrive within 350 milliseconds, and no later observed gap may exceed 150 milliseconds. These are teaching thresholds, not recommended limits for a real product or evidence about human comfort. Apply both to A, B and C.

A passes the first condition because it starts at 100 milliseconds, but fails the gap condition because of its 450-millisecond pause. B passes both: its first token arrives at 300 and its largest gap is 100. C fails both because it starts at 500 and has a 200-millisecond gap. Exactly one of the three traces passes the combined rule.

A first-token-only report would count A and B as successes. A completion-only rule set at 700 milliseconds would count all three. The different counts follow from different questions. Decide which events matter, how to combine the conditions and how to handle missing intervals before looking at the result. Our tiny constructed set illustrates those choices; it cannot establish a service’s reliability.

11

A visible pause does not identify the component that caused it

A’s final pause is real within our invented arrival record, but the record gives no cause. The server might not have produced more content yet, or content might have been delayed elsewhere. The trace does not distinguish those possibilities. Calling the whole pause model time would add information that was never measured.

The vLLM metrics design names separate engine events for entering a queue, being scheduled and producing new tokens [2]. Those timestamps support questions that client arrivals alone cannot answer. If a real investigation needed to separate queue waiting from later work, it would need suitable server evidence connected to the same request.

Likewise, a display problem needs display evidence. Recording arrival at an application boundary is different from recording when the reader sees the text. Keep those timelines distinguishable, and check that any clocks being compared are compatible. Here we intentionally stop at the client boundary. The honest conclusion is that A contains one long observed gap, while the responsible component remains unknown.

12

Keep the formula beside the events that produced the number

A useful report should let another reader reconstruct its numbers. For these examples, that means retaining each request’s send time, event times, token counts per event and completion boundary. It also means saying that the times are invented. A long list of precise values is not a substitute for an actual measurement.

If you collect a real trace later, record which tool and version produced it, how output tokens were counted and which requests entered each summary. Keep the first-response definition separate from any screen-rendering measurement. Record failures and exclusions so a faster-looking average cannot hide a changed set of completed requests.

For our constructed traces, the findings are clear: equal finishing times can hide different pauses; request and gap averages can differ; bundled tokens change the relationship between events and tokens; and a single-token request has no later-token average. None of this identifies the best model. It gives you a way to read a latency claim closely enough to understand what was measured and which experience its number actually describes.

A first-token pass does not guarantee a smooth stream. Invented teaching targets only: first token within 350 ms AND every later observed gap within 150 ms. These are not recommended production limits.
Invented teaching targets only: first token within 350 ms AND every later observed gap within 150 ms. These are not recommended production limits. · Ameer Journal — original explanatory diagramOriginal editorial illustration; no third-party artwork reused.
Follow the evidence

Sources & further reading

Explore the references behind this guide. External pages may change after our review.

  1. Benchmark CLI - vLLM
    vLLM · Accessed 7 Nov 2026
  2. Metrics - vLLM
    vLLM · Accessed 7 Nov 2026
  3. GenAI-Perf — NVIDIA Triton Inference Server
    NVIDIA · Accessed 7 Nov 2026

Article updated 7 Nov 2026.

Found something we should revisit?

Good explanations get better with thoughtful feedback.

Suggest a correction