n4nAI

GPT-5, Claude Opus, and Gemini 3 under concurrent load

Engineering analysis of GPT-5, Claude Opus, and Gemini 3 throughput under concurrency, covering batching, caching, and fallback tradeoffs for production.

n4n Team4 min read949 words

Audio narration

Coming soon — every post will get a voice note here.

Flagship model speed under concurrent load is the metric that actually breaks production LLM systems, not the polished single-call latency in provider marketing. When you fire hundreds of simultaneous requests at GPT-5, Claude Opus, and Gemini 3, the rankings invert compared to isolated benchmarks because each provider makes different tradeoffs in batching, context caching, and queue admission.

The thesis: concurrency exposes architecture, not raw speed

Single-request latency tells you how fast a model thinks when it has the whole server to itself. That is a lab condition. In production you have 50 background summarizations, 20 chat streams, and a batch job all hitting the same endpoint. The model that wins the benchmark often loses the queue.

The core argument: flagship model speed under concurrent load is governed by three variables—batch scheduling policy, context caching efficiency, and hardware homogeneity—not by quoted TTFT (time to first token). Engineers should design for the tail, not the median.

How each provider handles parallel requests

GPT-5: adaptive batching with speculative decoding

OpenAI’s serving stack has historically used continuous batching and, in recent flagship generations, speculative decoding to mask decode latency. Under moderate concurrency (say 32–128 active sequences) GPT-5 keeps token throughput high because the scheduler packs sequences of similar length into the same step.

The tradeoff is head-of-line blocking on long completions. If one request asks for 8k tokens, it occupies a batch slot for many steps, delaying shorter requests. In practice you mitigate this by capping max_tokens per request class.

Claude Opus: fairness over raw throughput

Anthropic’s Claude Opus line prioritizes per-request fairness. The scheduler avoids starving any single stream, which produces predictable tail latency but lower aggregate tokens/sec per GPU than a greedy batcher. Under bursty load, Claude Opus will shed excess requests with 429s earlier than competitors rather than let queue depth explode.

This is actually a feature for user-facing chat: you get consistent experience at the cost of needing more replicas to absorb spikes. Prompt caching via cache_control blocks markedly reduces repeated prefix cost, but only if you pin the cache across requests.

Gemini 3: TPU parallelism scales near linearly

Google’s Gemini models run on TPU pods with high-bandwidth interconnect. The architecture favors embarrassingly parallel inference: throughput scales close to linearly with added chips until collective ops saturate. Under heavy concurrency Gemini 3 often sustains higher aggregate token rates than GPU-backed peers, provided requests are independent and context lengths are uniform.

The weakness is variable-length sequences: padding waste grows when you mix 1k and 32k contexts in the same batch. Use batch endpoints for bulk jobs, not mixed interactive traffic.

Measuring it without trusting vendor dashboards

Vendor status pages show “availability” not “your p95 under load”. Write a harness that replays your real traffic shape. Below is a minimal asyncio shooter against an OpenAI-compatible endpoint.

import asyncio, time, openai

# One OpenAI-compatible endpoint covering 240+ models with fallback:
client = openai.AsyncOpenAI(base_url="https://api.n4n.ai/v1", api_key="YOUR_KEY")

async def fire(model, prompt, sem):
    async with sem:
        t0 = time.monotonic()
        await client.chat.completions.create(
            model=model,
            messages=[{"role": "user", "content": prompt}],
            max_tokens=512,
        )
        return time.monotonic() - t0

async def load_test(model, n, conc):
    sem = asyncio.Semaphore(conc)
    tasks = [fire(model, "Summarize: " + "x"*2000, sem) for _ in range(n)]
    return await asyncio.gather(*tasks)

# latencies = asyncio.run(load_test("gpt-5", 200, 50))

Swap the model string for claude-opus or gemini-3 and compare the latency distributions. The point is not the absolute numbers but the shape: Claude Opus will show tight variance, Gemini 3 a flat median with occasional spikes, GPT-5 a long tail if max_tokens varies.

Fallback converts outages into latency

When Claude Opus sheds load with 429s, a client that blindly retries amplifies the storm. A gateway with automatic fallback when a provider is rate-limited or degraded shifts the request to GPT-5 or Gemini 3, trading model flavor for availability. This keeps p99 bounded at the cost of occasional response heterogeneity. In a showdown of flagship model speed under concurrent load, the system that degrades gracefully wins.

Cache-control and routing directives dominate

Under load, the cheapest token is the one you don’t compute. All three providers support some form of prefix caching, but the hints must be forwarded correctly. A gateway that strips cache_control silently destroys your throughput.

{
  "model": "claude-opus",
  "messages": [
    {"role": "system", "content": "You are a strict JSON extractor."},
    {"role": "user", "content": "Extract from: {{long_doc}}"}
  ],
  "cache_control": {"type": "ephemeral"}
}

If you route through a layer that honors client routing directives and forwards provider cache-control hints, you preserve the cache hit rate across fallback. n4n.ai does this while metering per-token usage, so a fallback from GPT-5 to Claude Opus on rate limit doesn’t lose the cached prefix if the system prompt matches.

Tradeoffs: cost, determinism, tail latency

  • GPT-5: Best blended performance for mixed workloads. Downside: opaque batching means you can’t predict exact queue wait; speculative decoding occasionally produces token repetitions under contention.
  • Claude Opus: Predictable, fair, early 429s. You pay for more replicas but sleep at night. Cache blocks expire fast if you don’t reuse prefixes.
  • Gemini 3: Highest raw throughput for uniform batches. Poor fit for long-tail interactive latency because of padding and TPU warmup on shape change.

Determinism is another axis: under concurrency, temperature=0 still yields token-order flips across retries because batch composition changes sampling paths. If you need reproducible outputs, pin a single sequence per request and accept lower throughput.

A concrete production pattern

Suppose you run a support bot with 300 concurrent sessions, each 4k context, max 300 response tokens. Profile:

  1. Route interactive traffic to Claude Opus with cache_control on the system prompt. Accept 429s and backoff.
  2. Route bulk reindex jobs to Gemini 3 batch API with fixed 2k context.
  3. Use GPT-5 as the adaptive middle tier for requests with variable length, capping max_tokens=400.

This triad exploits each architecture’s strength. The flagship model speed under concurrent load for your system becomes the weighted sum of three schedulers, not one model’s hero number.

Decisive takeaway

Stop benchmarking flagships in isolation. The model you pick for concurrent load should match your traffic shape: Claude Opus for fair interactive latency, Gemini 3 for parallel batch throughput, GPT-5 for mixed variable-length serving. Measure with your own replay harness, forward cache hints, and design for p99, not the marketing TTFT. Flagship model speed under concurrent load is an emergent property of your stack, not a spec sheet line.

Tagsgpt-5claude-opusgemini-3concurrencythroughput

Written by

n4n Team

The team building n4n — a single OpenAI-compatible API in front of 240+ models, with automatic fallback, load balancing and pay-per-token metering.

More from n4n Team →

All flagship model speed showdown posts →