Start Building
Technical

End-to-End Latency vs the Metrics That Make It Up

E2E latency is not one number to optimize. Here is what actually composes it, and how to diagnose which component is the real problem.

Author photo
packet.ai Team
September 3, 2026

End-to-end (E2E) latency is the total time from sending a request to receiving the complete response, and it's the number most people mean when they say an LLM app's inference speed "feels slow." Understanding what actually happens during LLM inference is the foundation for this; E2E latency isn't one thing to optimize on top of that, it's the sum of several genuinely distinct latency metrics, each governed by different bottlenecks and fixed by different techniques. This guide covers the llm performance metrics that actually compose E2E latency, how to tell which one is dragging yours down, and why treating E2E as a single number leads to fixing the wrong problem.

Key takeaways

  • E2E latency decomposes into queueing, prefill (time to first token), and decode (time per output token, repeated across the full response), plus network and streaming overhead
  • Each component has a different bottleneck: prefill is generally compute-bound, decode is generally memory-bandwidth-bound, and queueing is primarily driven by concurrency, scheduling, and available capacity, not the model's own generation speed
  • A single end to end latency number hides which component is actually the problem; the same total time can come from a slow first token, slow generation throughout, or both
  • Perceived latency and measured E2E latency aren't the same experience: streaming can make a mediocre E2E time feel fast, and a poor streaming implementation can make a fast E2E time feel slow
  • Model latency SLAs that quote only an average E2E figure hide the tail; for production systems, percentiles such as p95 and p99 can reveal tail behavior that an average obscures

What Actually Makes Up End-to-End Latency

A full latency breakdown of a typical llm response time, sometimes called time to last token to distinguish it from time to first token, can be usefully broken down into four main pieces. Real serving stacks have additional measurement conventions and overhead beyond this, but this is the framework that matters for diagnosis:

Component What it measures Bottleneck
Queueing Time waiting for a GPU to become available before processing starts Concurrency and available capacity
Prefill / TTFT Time to process the prompt and produce the first output token Generally compute-bound
Decode / TPOT Time per subsequent output token, repeated across the full response Generally memory-bandwidth-bound
Network and delivery Transit time and how the client receives and renders the response Infrastructure and client implementation

NVIDIA's own current LLM benchmarking documentation defines TTFT as generally including request queuing time, prefill time, and network latency, and defines end-to-end request latency as including queueing, batching, and network latency, essentially the same breakdown used here. Time to first token, the delay before anything appears, is covered in depth in the packet.ai What Is TTFT guide, and the tradeoffs between TTFT and per-token generation speed are covered in the TTFT vs Tokens Per Second guide. This post's job is narrower: showing how those pieces, plus queueing and delivery, add up to the single end to end response time a user actually experiences.

Why These Components Have Genuinely Different Bottlenecks

Prefill processes the entire prompt in one compute-heavy pass, which is why it scales primarily with prompt length and available compute throughput. Decode generates output one step at a time, reading the model's full parameter set from memory on every step, which is why it scales with output length and available memory bandwidth rather than raw compute. These are architecturally distinct phases, covered in detail in the packet.ai Prefill vs Decode guide, and some production serving architectures now run them on genuinely separate GPU pools specifically because their resource profiles don't share a bottleneck.

Queueing is a different category of delay entirely: it's primarily driven by concurrency, scheduling policy, admission control, and available capacity, not by how fast the model itself generates tokens. A model with excellent prefill and decode speed can still have terrible E2E latency under high concurrent load if requests are queueing before they even start processing. This is why a latency sla quoted from a single-request benchmark, with no other traffic on the system, can be meaningless for a production deployment running at real concurrency.

E2E Latency and Perceived Latency Are Not the Same Experience

The measured E2E number and how fast an app actually feels to use are related but genuinely separate things, and conflating them leads to optimizing the wrong target. Streaming a response, covered in the packet.ai guide to how LLM response streaming works, doesn't change the measured E2E time at all: the full response still takes exactly as long to generate. What streaming changes is when the user starts seeing output, which can make a mediocre E2E time feel fast if TTFT is quick and content streams in steadily afterward.

The reverse is also true: a genuinely fast E2E time can still feel slow if the client buffers the response before displaying it, or if a reasoning model's longer prefill delays the first visible token even though total generation finishes quickly. Optimizing the E2E number without accounting for how it's actually delivered to the user can produce a system that benchmarks well and still feels unresponsive.

Why an Average E2E Number Hides the Real Problem

A single average E2E latency figure collapses two very different failure modes into one number. A system with a slow, consistent TTFT and fast decode looks the same on average as a system with a fast TTFT and slow, inconsistent decode, but the fix for each is completely different: the first needs prefix caching or better prompt handling, the second needs serving engine tuning or different hardware. Reporting llm performance metrics only as one blended average, rather than breaking out TTFT, TPOT, and queueing separately, makes it impossible to tell which lever to actually pull.

The same problem applies to percentiles, not just component breakdown. A model latency figure reported only as an average can look excellent while its p99, the experience of the slowest 1% of requests, is genuinely bad. For production systems, percentiles such as p95 and p99 can reveal tail behavior that an average obscures, though which percentile actually matters most depends on the product's own SLO and traffic pattern, not a universal rule. Since a meaningful share of users having a bad experience shows up somewhere in that tail rather than at the average, a latency sla built entirely around average E2E time can technically be met while those users still have a noticeably worse experience than the headline number suggests.

A Practical Way to Diagnose E2E Latency

When E2E latency is worse than expected, the useful question isn't "why is it slow," it's "which component is slow." Logging TTFT and total generation time separately, rather than only the combined E2E figure, is the single highest-leverage change for actually diagnosing this. Current server-side metrics from serving engines like vLLM and TensorRT-LLM already expose queue time, TTFT, and inter-token latency as separate histograms specifically so this diagnosis doesn't have to be reconstructed by hand.

A slow TTFT with fast, consistent decode points toward prefill-side fixes: prompt length, prefix caching, or queueing under load. A fast TTFT with slow or inconsistent decode points toward serving-engine tuning or hardware. Consistently high E2E with both components individually reasonable often points to queueing, meaning the real fix is capacity, not any single-request optimization at all.

Where This Fits Operationally

Decomposing and tuning each of these components separately, prefill, decode, queueing, and delivery, is exactly the kind of ongoing serving-layer work a managed inference provider is positioned to absorb rather than something every team needs to instrument and re-tune independently. packet.ai's Token Factory is being built with these considerations handled at the serving layer. It's currently in private preview, with the specific model catalog and pricing still being finalized.

Join the waitlist for early access once it opens.

Sources and Further Reading

Frequently asked questions

End-to-end latency is the total time from sending a request to receiving the complete response, including queueing, prefill (time to first token), decode (generating the rest of the response), and network or delivery overhead. It's the number a user actually experiences, but it's a sum of several distinct components, not one thing.
Because measured E2E time and perceived speed are related but separate. Streaming can make a mediocre E2E time feel fast if the first token arrives quickly and content streams in steadily. Conversely, a fast E2E time can feel slow if the client buffers output before displaying it, or if a slow first token delays what the user actually sees, even though total generation finished quickly.
Because it collapses genuinely different problems into one number. A slow first token with fast decode looks the same on average as a fast first token with slow decode, but each needs a completely different fix. Averages also hide the tail: a system can have a good average E2E time and a bad p99, meaning a meaningful share of real users have a worse experience than the headline number suggests.
Log time to first token and total generation time separately rather than only the combined E2E figure. Serving engines like vLLM and TensorRT-LLM already expose queue time, TTFT, and inter-token latency as separate metrics. A slow first token with fast, consistent generation afterward points to prefill-side fixes like prefix caching. A fast first token with slow or inconsistent generation points to serving-engine tuning. High E2E with both components individually reasonable often points to queueing under load, meaning the fix is capacity, not per-request optimization.

Last reviewed: September 3, 2026. For the individual components that compose E2E latency, see the packet.ai What Is TTFT guide, Prefill vs Decode guide, and streaming guide.

Waste less compute.

Same models. Same API. Fraction of the cost. Start free — no credit card required.

Start Building →

More from the blog