Skip to content

Performance

  • 2,000 active player states
  • 500 scans/second sustained, 2,000/second bursts
  • Chat scan latency: median ≤ 1 ms, p99 ≤ 5 ms

The scan path does no database, file, YAML, list-parsing, network, GUI, or regex-compilation work. It uses:

  • immutable atomic engine snapshots (lock-free reads);
  • a sparse Aho-Corasick automaton for literals;
  • precompiled RE2/J rules with bounded inputs and match counts;
  • early rate-limit rejection and bounded histories, caches, and queues;
  • a fixed logarithmic latency histogram (no extra metrics dependency).

No Bukkit objects are retained beyond the listeners. Surface adapters only build context objects and apply the returned decision; warnings, alerts, events, kicks, sounds, commands, and persistence are scheduled off the scan.

SurfaceLimit
Chat512 code points
Commands2,048
Sign linesplatform max, 4-line cap
Book pages1,024 each, 100-page cap
Anvilplatform rename max
Custom API4,096
  • Default automaton ≤ 5 MiB; player-state memory ≤ 64 MiB for 2,000 actors.
  • No unbounded heap growth; no queue drops at sustained target load; no main-thread database stalls.
  • Development jar ≤ 16 MiB; final release jar ≤ 14 MiB after ProGuard.

Use /daisyfilter status for live p50/p95/p99 timings, throughput, active actor states, and queue counters.