Benchmarks · Scenario library

Latency under load, scenario by scenario

Every request either passes clean, gets blocked on the way in, or gets blocked on the way out — here’s the concurrency sweep for each, with the rule count, payload size, and flow behind every curve.

These are the same measured runs behind the headline numbers on the main benchmarks page, broken out per scenario so you can see exactly what each one is measuring — not just the fastest numbers.

ValGuard delivers sub-80ms p99 latency in realistic multi-agent flows and blocks bad inputs in under 110ms p99 — even at 1,000 concurrent requests.

Live Metrics: Automatically benchmarked on VMware VM every 48 hours. Last run: Aug 28, 2026.

Input blocked before the model call

Bad prompts never reach the LLM — and never hit your bill.

A prompt-injection attempt is rejected by the input guard before any upstream request is made. No model call, no token spend, no wasted round trip.

400 Blocked1 input rule · prompt_injection · on_fail: block112 B request bodyInbound guard → rejected pre-upstream (no LLM call)
p50
55.27 ms
p99
107.44 ms
p99/p50
1.94

Output blocked before it reaches you

A broken model response gets caught, not shipped downstream.

The upstream returns non-JSON text where structured output was required. The output guard rejects the response before it ever reaches your application code.

403 Blocked1 output rule · json_validity · on_fail: block76 B request bodyFull round trip → output guard rejects on the way back
p50
175.02 ms
p99
237.72 ms
p99/p50
1.36

Realistic production path

The default shape: one guarded call to a real HTTP upstream.

Full proxy round trip against an HTTP upstream (BYOK custom provider) with a JSON response — the same path most agents run in production, end to end.

200 OK1 output rule · json_validity · on_fail: warn77 B request bodyFull HTTP round trip · custom provider upstream, JSON body
p50
144.33 ms
p99
222.78 ms
p99/p50
1.54

Streaming, with zero added tail latency

Guardrails don't break SSE — the stream still just streams.

Same guarded path, but the upstream responds over Server-Sent Events and the full stream is consumed — proving validation overhead doesn't leak into streaming latency.

200 OK1 output rule · json_validity · on_fail: warn98 B request bodySSE stream passthrough · fully consumed
p50
326.77 ms
p99
380.73 ms
p99/p50
1.17

The honest floor: zero network

No upstream call at all — this is pure ValGuard overhead.

Upstream is mocked in-process (no network hop), isolating exactly what the proxy + validation engine cost on their own, with everything else held constant.

200 OK1 output rule · json_validity · on_fail: warn70 B request bodyMock upstream · in-process, no network hop
p50
39.76 ms
p99
94.47 ms
p99/p50
2.38

Multi-agent handoff, end to end

Three agents, three validation gates, still microsecond-scale.

Tightest tail under load — p99 stays ~1.05× p50 at 1,000 concurrent

A 3-step linear playbook (triage → compliance → reply) with a validation gate at every handoff — the orchestration overhead on top of the proxy path.

200 OK3 validation gates across the handoff~16 B user messageOrchestration · 3-step linear handoff (X-VG-Flow)
p50
70.02 ms
p99
73.82 ms
p99/p50
1.05

ValGuard vs typical middleware

ValGuard’s numbers are the measured scenarios on this page. “Typical middleware” is a general reference point for classifier- or LLM-judge-based guardrails and synchronous re-check patterns — not a specific named product.

SignalValGuardTypical middleware†
p99 latency at 1,000 concurrent requests73.82–380.73 ms (measured, path-dependent)Often 200 ms – 1 s+ under equivalent load
Bad input rejected before the model is calledYes — inline guard, no upstream callRarely — usually checked after the model replies
Verdict consistencyDeterministic — same input, same result, every timeOften probabilistic (classifier/LLM-judge drift)
Added cost per request~$0 — no extra model callExtra LLM call or ML inference per request

† Illustrative industry reference points for classifier/LLM-judge-based guardrails, not a specific benchmarked product.

How to read these curves

  • p50 / p95 / p99 track together at low concurrency and fan out once the pool saturates — that fan-out point is the honest capacity limit, not the p50 at concurrency 1.
  • Blocked scenarios (input/output guard) are measured on the rejection path itself — the win isn’t just correctness, it’s that a rejected request never pays for a model call.
  • Mocked upstream scenarios isolate proxy + validation cost from network/model latency, so the numbers are reproducible across environments.