Early Access EnforceGate vX Early Access is open — request your invite.

Enterprise and carrier-grade web filtering increasingly means combining threat-intelligence feeds, category blocklists and regulatory domain lists — aggregated, these reach tens to hundreds of millions of rules. Two questions decide whether a gateway can serve that scale: can it hold the rules at all, and is it still fast?

EnforceGate vX answers both on a single commodity machine. In our in-house benchmark it loaded and enforced 150 million domain-policy rules in under 5 GiB of memory and held its speed flat as the rule set tripled from 50M to 150M. And — measured end to end against a live engine — it adds about 70 µs to a request at the median (p99 under ~210 µs) and sustains ~68,000 policy decisions per second on a single node. The in-memory rule match is ~0.2 µs of that; the rest is the connector⇄engine round-trip — measured here, not omitted.

150M
rules on one node, every rule verified
~70 µs
end-to-end decision (p50) · p99 < ~210 µs
~68,000
policy decisions per second, per node
< 5 GiB
memory to run 150M rules (high-density)

01 Why this matters to the business

For a CTO, the question behind a web gateway is operational risk: will the box that inspects every outbound request become the bottleneck — or the single point of failure — as policy grows? For a CSO, it is coverage and control: can we enforce the full breadth of threat-intel and category data we are paying for, on our own infrastructure, without shipping every lookup to a vendor cloud?

Most products force a trade-off. Cloud-rated filtering services keep the big database off-box but add a network round-trip — and an external dependency — to decisions they cannot answer from cache. On-box engines that try to hold large custom lists tend to slow down or run out of memory as the lists grow. EnforceGate vX is built to avoid both: the entire policy lives in memory on your node, and the match structure is designed so that lookup time does not grow with rule count.

02 The headline: 3× the rules, same speed

The result that matters is not raw capacity — it is that per-decision latency stays flat as the policy grows. Tripling the rule set from 50 million to 150 million leaves the common-case decision time essentially unchanged at roughly 0.23 µs in high-density mode. Capacity scales; latency does not.

Chart: rule count rises from 50M to 150M while common-case decision time stays flat at about 0.23 microseconds.
Decision speed holds as the policy grows. The rising bars are the rule count (50M → 100M → 150M); the orange line is the common-case decision time, which stays essentially flat. A customer can grow their rule set 3× without users experiencing any slowdown.

To be precise, this ~0.2 µs is the rule-match step — the in-memory work of testing one URL against the loaded policy ("common case" = a destination not on any blocklist, the dominant pattern). It is the part that scales to 150 million rules without slowing down. But it is not the latency a request actually pays; for that you have to measure the whole decision — which is the next section.

03 The decision an operator actually pays for

The match step is the cheap part. A real request pays for the work around it: the connector reads the request, serializes a query and sends it to the engine over the encrypted defendr channel; the engine parses, matches and returns a verdict. That round-trip is the latency EnforceGate adds to a proxied request, and it is the figure you should size capacity against. We measure it directly — driving the shipping connector binary against a live engine under a concurrency sweep.

Chart on a log scale: the in-memory rule match is about 0.2 microseconds; the end-to-end decision is about 70 microseconds at p50 and 206 at p99.
The match is a sliver of the decision. The in-memory rule match is ~0.2 µs; the full end-to-end decision is ~70 µs at the median and ~206 µs at p99 (log scale). Both are real, and both are published here — answering the fair criticism that only the match step had been.

Measured end to end against a live engine, a single node sustains ~68,000 policy decisions per second, saturating at around 8 concurrent requests, with a median of ~70 µs and every percentile — up to p99.9 — staying under ~280 µs even at 64-way load.

Chart: end-to-end decisions per second rises with concurrency to a plateau around 68,000 per second per node.
~68,000 decisions per second, per node. Throughput rises with concurrency to a plateau around 8 in-flight requests — gated by the round-trip, not the match. (The CPU runs millions of match steps per second; a full decision is the request round-trip.)

Reading percentiles. A percentile — p50, p95, p99, p99.9 — is the latency that a given share of requests come in under. p50 is the median: half the decisions are faster, half slower. p95 and p99 describe the slow tail — 95% and 99% of decisions finish below that figure — and p99.9 is the slowest 1 in 1,000. The tail is what a user feels on a bad request, so a tight p99 / p99.9 matters more than a fast average.

Chart: end-to-end decision latency percentiles p50, p95, p99, p99.9 across concurrency 1 to 64, all under about 280 microseconds.
Tail latency stays tight under load. p50 through p99.9 across a 1→64 concurrency sweep; every percentile stays under ~280 µs.

What this measures — and what it doesn't. The end-to-end figure is EnforceGate's own overhead: connector read, defendr serialization, the TLS socket hop to the engine and back, engine parse, the policy match, and response build. It does not include the client TLS handshake, payload decryption, or Squid's own processing — those are OpenSSL / Squid / kernel costs, not EnforceGate's, and belong to a separate proxy-level (Gbps, wire-to-wire) benchmark.

The end-to-end sweep ran against a live 9.2M-rule policy; the match component is scale-independent (see §02), so the decision cost is essentially the same at 150 million rules.

04 A 150M-rule policy fits a modest server

High-density mode runs 150 million rules in under 5 GiB of steady-state memory — about 33 bytes per rule — and memory grows linearly and predictably with rule count. Capacity planning is a simple multiplication, with no cliffs or sudden jumps. The whole policy loads well within a 16 GiB budget, comfortably inside a single mid-range VM or appliance.

Chart: steady-state memory versus rule count. High-density mode reaches 4.9 GiB at 150M rules; performance mode 15.7 GiB.
Steady-state memory scales linearly. High-density mode keeps 150M rules under 5 GiB; performance mode trades memory for lower latency. Operators choose the mode by hardware and traffic profile; the engine also selects automatically by rule count.
Rules Memory — high-density Memory — performance Common-case decision On-disk policy
50 million1.7 GiB4.4 GiB0.23 µs0.86 GiB
100 million3.2 GiB8.8 GiB0.26 µs1.72 GiB
150 million4.9 GiB15.7 GiB0.23 µs2.58 GiB

Provisioning a fresh 150M-rule policy takes about two minutes to compile offline and one to two minutes for the engine to cold-load on start or deploy — so a deployment that runs on a small server also provisions within minutes.

05 How the approach compares

The table below contrasts EnforceGate vX with the web-gateway architectures buyers most often weigh it against: cloud-rated secure web gateways (the cloud-delivered URL-filtering services), and the open-source proxy add-ons that teams once assembled themselves — chief among them SquidGuard, a legacy project that has been long dead (its last release was in 2009). The comparison is architectural — it reflects how each approach is designed to work, not a head-to-head lab benchmark of any specific product.

Dimension EnforceGate vX Cloud-rated SWG
/ proxy appliance
(typical commercial)
SquidGuard
(legacy open source)
Where matching happens On-box, in memory — every request decided locally Local cache + cloud rating service for category / uncached lookups On-box, against on-disk blacklist files
Large custom rule capacity 150M rules, lab-measured, in < 5 GiB Local/custom URL lists are bounded; broad coverage relies on the vendor cloud database Designed for modest lists; not architected for 100M+ entries
Decision latency at scale ~0.2 µs, flat as rules grow Cache hits fast; cache/category misses incur a network round-trip to the cloud Per-request file lookup; slows and grows memory as lists enlarge
External dependency at decision time None Cloud rating subscription for uncached / category decisions None (you assemble and maintain the lists yourself)
Data residency Fully self-hosted — traffic, policy and logs never leave your network URL / category queries are sent to the vendor cloud Self-hosted
Licensing model By edition (Lite free) — no per-seat, per-Gbps or per-request metering Appliance / VM tier plus throughput-bound service subscriptions Free / open source
Maintenance status Actively developed and supported by the engineers who write it Vendor-maintained A legacy project that is long dead — last release ~2009; not viable for new deployments

On this comparison. The "Cloud-rated SWG / proxy appliance" column describes the typical architecture of commercial secure web gateways with cloud-delivered URL filtering, summarised from publicly available product documentation as of 2026 — not an independent benchmark of any specific product, and capabilities vary by model, platform and licence tier. EnforceGate vX figures are from the in-house benchmark described below.

06 How it was measured

So the numbers can be trusted and reproduced, the benchmark exercises the complete production path — author, compile, cold-load, enforce, and decide end to end — using the shipping parser, storage layer, match engine and connector, not a model or simplified stand-in.

  • Real product code. The same components that ship in the product produced these figures.
  • Realistic corpus. Rules are unique, realistically-shaped domain names, generated deterministically so any run is reproducible.
  • Honest memory measurement. Memory is read from the operating system's own accounting of the engine process (resident set size), capturing both steady state and the transient load peak.
  • Correctness-gated. Before any figure is accepted, the run verifies that a large random sample of rules resolves correctly and that non-rule traffic correctly does not match. A failure invalidates the run.
  • Single node, single core for the match step. Match latencies come from one commodity x86-64 system (specified below) and are single-threaded, so multi-core nodes match proportionally more.
  • End-to-end via the real binaries. The decision round-trip figures come from a separate harness that spawns N real connector processes against a live engine over the encrypted defendr wire (TLS on), times each request's full round-trip and reports throughput plus latency percentiles per concurrency level. Warm-up is excluded, so the numbers are steady-state.

Test system

For full transparency, the figures in this paper were produced on a single, off-the-shelf commodity x86-64 machine — no specialised accelerators, no exotic hardware:

Software under testEnforceGate vX 2026.35.0
CPUAMD Ryzen 9 9950X3D — 16 cores / 32 threads, AMD 3D V-Cache, boost up to ~5.76 GHz
Memory96 GB DDR5 (Socket AM5 platform)
Architecturex86-64, single socket
Operating systemLinux (kernel 7.0)
Lookup measurementSingle-threaded — one CPU core, the rest idle

The 150-million-rule policy uses under 5 GiB in high-density mode, so memory capacity was never the limiting factor on this host — the headroom simply confirms the footprint figures. Lookup latencies reflect a single core; a production node serving traffic across all available cores scales throughput proportionally.

07 Scope & caveats

  • Figures are lab-measured on a single commodity machine (see Test system) under controlled conditions; production numbers vary with hardware, traffic mix and co-located workloads.
  • Two distinct latencies are reported, deliberately. The ~0.2 µs figure is the in-memory rule-match step; the ~70 µs / ~68,000-per-second figures are the end-to-end decision — the full connector⇄engine round-trip EnforceGate adds to a request. Quote the end-to-end number for request-latency and throughput claims; the match number is a component of it, not a substitute.
  • The end-to-end figure is EnforceGate's own overhead — it does not include the client TLS handshake, payload decryption or Squid's processing (OpenSSL / Squid / kernel costs). A full proxy-level (Gbps, wire-to-wire) benchmark is a separate, recommended exercise.
  • The "flat latency" result is for the common (permitted) path — the dominant case. Decisions for blocked destinations are also sub-3 µs but do rise modestly with scale.
  • "Rules" here are domain-policy entries — the dominant high-volume rule type. Regular-expression URL rules have different, lower-cardinality characteristics and are not the subject of this 150M claim.
  • The benchmark measures load, lookup, and the end-to-end decision round-trip under a concurrency sweep; it is not yet a multi-hour production-traffic soak. A sustained-load endurance test is a recommended follow-up before publishing hard SLAs.

Sizing a large deployment?

We are happy to walk a CTO or security team through the benchmark methodology and the raw per-run data under NDA for technical due diligence.