Skip to content

v2026.7.17: The numbers, refreshed — and REAL out-runs PCRE2's JIT on class scans.

Choose a tag to compare

@github-actions github-actions released this 05 Jul 04:25

The numbers, refreshed — and REAL out-runs PCRE2's JIT on class scans.

The headline: on the devbox, with the PCRE2 JIT verified on (PCRE2_CONFIG_JIT = 1), REAL now out-runs
PCRE2-JIT on class scans
[a-z]+ 1.94×, [0-9]+ 1.73×, [^,]+ 1.11×, level on the rare-byte date —
where the earlier baseline trailed it. Every benchmark section is re-measured on this version under one
unified Conditions banner, non-cherry-picked (the losses show: PCRE2-JIT still leads straight-line
literals/alternation; the bounded lookahead is honestly slow, the cost of doing it in linear time). Still
5.6–27.6× over std::regex and 1.1–8.6× over RE2; the Python binding is a 2.06× geomean over re, with the
capture-dense email case flipped from a past loss to a win. A benchmark-harness bug was fixed along the way —
the REAL-vs-rust duel now compares rust's captures_iter (both engines extracting groups), and REAL beats it
3.3–6.1× on class/digit/field scans.

A Rust crate is born. real-regex — a safe wrapper over a new C ABI shim (bindings/c/), with the same
linear-time, ReDoS-safe guarantee and bounded lookarounds RE2 and the regex crate cannot offer. Its tests
agree span-for-span and group-for-group with the regex crate. It carries the same calendar version (CalVer
is valid SemVer), single-sourced through make version-check; the first cargo publish is manual, after this
release is live.

Structure: the Python binding moved under bindings/python/, so all language bindings live in one place
(bindings/: c/, python/, rust/). No API change — the wheel, get_include(), and every import are unchanged.