Skip to content

Audit cleanup - #4

Merged
bgreni merged 70 commits into
mainfrom
audit-cleanup
Sep 24, 2026
Merged

bgreni merged 70 commits into
mainfrom
audit-cleanup

Conversation

@bgreni

@bgreni bgreni commented Sep 24, 2026

Copy link
Copy Markdown
Owner

No description provided.

bgreni and others added 30 commits September 23, 2026 11:59
…shorthand classes)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
bench_compare_pcre2.py carried copies of print_comparison/speedup_bar and
gen_pdf's build_table_data/generate_pdf differing only in labels, widths
and titles. Parametrize the originals (defaults unchanged) and import them.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…-char forwarders

PikeVM._check_anchor/_is_word_char duplicated _bt_check_anchor; the
_bt_/_sbt_is_word_char forwarders become is_word_byte, and the WORD /
NOT_WORD arms share one body.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
A one-off cross-check CI never runs (--check-baseline refused it). Removes
parse_gcov_intermediate, the gcov branches in cover_one, the flag and its
guard, the opt/llvm-cov lookup and TestGcovParse. compiler-rt stays: the
default link pulls libclang_rt.osx.a (clang -### shows it), and clang_impl
depends on it anyway; its pixi.toml comment now says so.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…them all)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Regex[pattern, flags: RegexFlags = RegexFlags()] compiles the flags as a
leading inline group (after any (*UTF8) verbs) through Regex._pat, which
is exactly `pattern` for the default flags, so default instantiations
keep the same memoized NFA and backtracker symbols. Drops the unused
RegexFlags.__and__ and fixes the README Flags section.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Replaces _sbt_to_lower, _bt_to_lower and nfa.mojo's _to_lower (same
ASCII A-Z rule; generic over the scalar type so the byte walkers and the
UInt32 codepoint builder share it).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ne guards

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Only the sub-match differs; the negated / keep-restore tail is shared.
The backtracker picks the sub-match with a comptime if, so each state
still elaborates exactly one arm.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…pers into edfa_match_at/sheng_match_at

Every caller passed the DFA's own start states; the LF wrappers passed
lf.d's, so they were edfa_match_at/sheng_match_at over lf.d.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
comptime_regex_stages, comptime_pattern_probe, comptime_stages and
compile_dashboard each wrote a source file, timed `mojo build` and checked
the return code. tools/timed_build.py now does that once; each tool keeps
its own flags, cache policy, timeout and error reporting. The pattern
probe stays separate: it builds against the precompiled package and ranks
many patterns, where the stages ladder builds against the source tree.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
One _add_state call for CHAR/ANY/CHARSET, one MATCH scan for the pinned
and unpinned modes (the cut only when unpinned); max_pos was never
passed by any caller.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
_sheng_walk_impl and _sheng_full_match_impl were _edfa_walk_impl and
_edfa_full_match_impl with a shuffle step (and a state-vector resync after
a region skip); cap == 0 keeps the table step. _sheng_step moves to
simd_kernels next to the tbl lookups it wraps.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
sweep_ctx superseded them (MULTIPATTERN_PLAN.md: the region-bounded
oracle was unsound for lookahead and anchors). __main__ now runs sweep_ctx;
_pin keeps a leading global flag group ((?i), (?s)) outside its wrapper,
which Python otherwise rejects. sweep_ctx_som stays as the SOM oracle and
takes over sweep_som's doc references. Case-table output is byte-identical,
and sweep_ctx_som matches the old sweep_som on every case.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The per-start walk moves into an @always_inline _longest_end that both
match_at and search_forward inline, so neither gains a call. The
unreachable pos > input_len break goes with it.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The same bench_set table parse and the same nine row pairs lived in both
scripts; the haystack size now comes from the row name's _16k/_64k suffix.
A failing `pixi run bench_set` now prints an error and yields no rows
(bench_compare_set's handling) instead of a traceback.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
`if "bench" in root` matched the absolute walk root, so a checkout under
any path containing "bench" skipped every test (test/ has no bench dir).
needs_pkg_rebuild (a != wrapper) and prune_results (one dict
comprehension, one caller) are inlined; their unit tests go with them.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- bench_compare: run_mojo_static_benchmarks absorbs _run_mojo_task (its
  only caller); comments naming the nonexistent bench_static.mojo now
  name bench.mojo.
- unused: statistics (comptime_stages), TA_CENTER and LIGHT_GREEN
  (gen_pdf).
- pixi.toml: the `build` task (mojo precompile -> emberregex.mojoc) was
  referenced nowhere, duplicated run_test.ensure_package and read like
  `pixi build`. The lock is unaffected (pixi lock --dry-run --check).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
bgreni and others added 28 commits September 23, 2026 12:32
LFDFA.valid always equalled d.valid (_edfa_finish sets it) and prev_ids
only fed one structural test; the look-behind states it appended to
`starts` were only renumbered, never read by the finish, so the table is
unchanged. That test is deleted: the invariant lives in the builder's
look-behind lane, not in the table, and test_both_class_atom_before_anchor
/ test_differential_both_class_atoms pin the same fix (bd077fe) through the
directly built LF table against the Pike VM. build_lf_dfa's minimize hook
had no other user.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…able_arr)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
_flatten_nfa's 13 arguments become a _FlatNFA built in place (its
constructor also runs _byte_classes); _class_ranges, _word_classes,
_eol_ok_bits and _bs_members replace the per-builder copies of the
rep_lo/rep_hi, word-class, pending-EOL and bitset->member-list loops.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…alls)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
# Conflicts:
#	emberregex/engine.mojo
#	emberregex/onepass.mojo
#	emberregex/static_dfa.mojo
#	emberregex/static_lfdfa.mojo
#	test/test_leftmost_first_dfa.mojo
#	test/test_word_boundary_dfa.mojo
set_pike_scan and set_pike_som_scan share _pike_scan[som]. The SOM
lane's per-thread / per-report starts move out of the recursive
closure: every state one closure adds carries the caller's start, so
the parallel lists are resized after _set_add_state returns. The plain
instantiation keeps the unchanged _set_add_state and _flush_reports
(asm-diffed against the base: identical save one cmp/b.ne ->
eor/tbnz pair).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Rose's _rose_pos_masks re-derived _litset_pos_masks from the flat meta
pools and rose_scan copied litset_scan's chunk loop. The masks now come
from litset_masks(Self._rose.lit) at decl level, and both scans run
teddy_front_end with their verify step as an inlined closure over an
immutable view of the input. The lane probe's teddy/rose functions and
constant pools are asm-identical to the previous build.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
bitnfa_scan and bitnfa_stream_chunk repeated the per-byte gather /
consume / exception table / shift / seed body; both now call the
@always_inline _bn_consume and _bn_advance helpers (block mode still
does not call the out-of-line stream function). Lane-probe asm and
constant pools are identical to the previous build.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
build_union_subset_nfa and splice_nfa give every pattern a fresh entry
state (each fragment start is a state its own build appended), so the
dup/-2 detection in _start_id_map and the exact _start_ids scan it
selected could only be reached by hand-editing pattern_starts, which is
all test_reverse_dfa_shared_entry_uses_exact_start_scan did.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
_rose_walk never read meta, lits or bcls, and _rose_confirm took lits
and bcls only to pass them on. Lane-probe asm unchanged.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
set_literal's _sort_reports + inline dedup and set_rose's sort_reports
+ dedup_reports were the same insertion sort (identical predicate) and
the same compaction; both lanes now call the Rose pair, moved to
set_pike.mojo. The moved bodies are asm-identical; the Teddy lane now
calls them out of line instead of inlining its private copy.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
needs_som never read its flags param; has_semantics re-inlined
any_ext; sem_table_arr's `b + SEM_MIN_LEN >= n` break could not fire
(its only caller sizes n = sem_table_len = SEM_STRIDE * num_patterns).
apply_semantics / apply_semantics_spans stay separate: SetMatch has no
start field, so one generic needs a trait or per-branch rebinds, which
is no shorter than the two 10-line loops.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- _SBN_* / _stream_bn / _can_stream only renamed _BN_* / _bitnfa /
  _bitnfa.valid; set_stream.mojo and test_set_phase6 read those.
- rebind[NFA](self._nfa) was a no-op now that _nfa is a plain NFA.
- mdfa_table_str / rdfa_table_str / rose_table_str were pure
  table_bytes wrappers, rose_flags_arr / ac_cls_arr pure int_arr
  copies; the decl-level sites (and the bench/tests that used
  mdfa_table_str) call table_bytes / int_arr directly.

Lane-probe asm and static data are identical to the previous build.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
extract_literal_chains expands each state at most once (the seen set),
and an expansion pushes at most two successors, so the walk pops at
most 2 * num_states + 1 entries; the 2 * num_states + 8 budget could
never run out. walk_pops stays (test_set_ac pins it).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
_emit_bits hand-rolled an insertion sort over the accepting ids before
its dedup; use sort(ids). Runtime, once per accepting byte on the
bitnfa block and stream lanes: revert if bench_set's bitnfa / stream
rows regress (the ids lists are small and near-sorted, where insertion
sort can win).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
_flush_reports hand-rolled an insertion sort over the ids reported at a
position; use sort(ids). Runtime, once per position on the tagged Pike
lane (word-boundary sets, residual Pike): revert if bench_set's
word-boundary scan row regresses.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
_flush_spans insertion-sorted two parallel lists (ids, starts); emit
the spans first and sort that slice of `out` by id with stdlib sort
instead (ids are unique per position, so the order is unambiguous).
Runtime, once per position on the SOM-carrying Pike (scan_som /
scan_spans of word-boundary and reverse-cap-blowup sets): revert if
those rows regress.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Both hand-rolled insertion sorts (per-id start/longest order, then the
cross-id start/id order) become sort(list, cmp). Both orders are total
over their inputs, so stability is moot. Runtime, once per scan_spans
call: revert if the scan_spans rows regress.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
… _pat

Routing Regex.nfa through the _pat ternary put that expression into every
lane method's type (via _num_slots) and cost ~20% compile time on
bench.mojo. nfa = _build_static_nfa(pattern, flags.value) keeps the
default-flags instantiations' expression the same shape as before;
_pat stays only at the backtracker call sites, where it measured free.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…UREMENT)"

This reverts commit 8805f07.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
apply_flags only ran in the comptime interpreter, so the coverage gate
counted its 26 runtime lines as uncovered (98.65% < 99.01% baseline).
Three runtime asserts on the existing flags test bring it back to 99.03%.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

Benchmark comparison

Advisory: this check reports but never fails the build. Hosted-runner noise reaches +200% on rows that changed nothing, so treat a flag as a prompt to measure locally, not as a verdict.

Runner: macos-14

070fe5c → 239c742 · 5 paired rounds, alternating order, warmup discarded · 126 shared rows

✅ No row regressed more than 20% on both statistics above the 0.02 ms noise floor.

Geometric mean of the paired-round medians: -0.1%.

All 126 shared rows
row base (ms) head (ms) min median
bench/anchor_word_boundary 0.00063 0.00062 -1.6% +67.2%
bench/static_realworld_ipv4 0.00064 0.00066 +3.1% +12.1%
bench/static_dfa_quantifier_bounded 0.00057 0.00059 +3.5% +8.8%
bench_set/set_mdfa_log_sparse_64k 0.10813 0.11004 +1.8% +7.8%
bench/static_dfa_alternation_8 0.00014 0.00015 +7.1% +7.1%
bench/static_realworld_log_parse 0.00326 0.00336 +3.1% +6.4%
bench_set/set_mdfa_log_dense_16k 0.04091 0.04143 +1.3% +6.3%
bench_set/set_mdfa_log_sparse_16k 0.0272 0.02738 +0.7% +5.3%
bench/static_lookbehind_positive 0.00077 0.00081 +5.2% +5.1%
bench/realworld_phone 0.00061 0.00061 +0.0% +4.9%
bench/realworld_key_value_findall 0.0323 0.03099 -4.1% +4.9%
bench/memo_ambiguous_plus_miss_1500 0.00424 0.00439 +3.5% +4.0%
bench/static_capture_email 0.00163 0.00163 +0.0% +3.5%
bench/replace_named_backref 0.00492 0.00498 +1.2% +3.5%
bench/reverse_suffix_search_64KB 0.58527 0.60928 +4.1% +3.4%
bench/capture_findall_sparse_64KB 0.28892 0.29294 +1.4% +3.3%
bench/counted_repeat_giveback_2KB 0.29548 0.28304 -4.2% +2.8%
bench/replace_50_matches 0.1268 0.12893 +1.7% +2.7%
bench/throughput_class_10KB 0.03825 0.0383 +0.1% +2.5%
bench_set/set_rose_full_sparse_64k 0.01106 0.01108 +0.2% +2.2%
bench/pathological_optional_16 0.00139 0.0014 +0.7% +2.2%
bench/findall_3_matches 0.02037 0.02009 -1.4% +2.1%
bench/static_pathological_optional_8 0.00053 0.00053 +0.0% +1.9%
bench/lf_dfa_class_run_search_20KB 0.16454 0.16099 -2.2% +1.7%
bench/findall_500_dot_matches 0.32584 0.33338 +2.3% +1.6%
bench_set/set_pike_wb_sparse_16k 0.45339 0.4453 -1.8% +1.6%
bench/throughput_literal_100B 0.00064 0.00064 +0.0% +1.6%
bench/static_greedy_tag 0.00064 0.00062 -3.1% +1.5%
bench/realworld_url_parse 0.00237 0.00242 +2.1% +1.3%
bench/alternation_4_search_2KB 0.02516 0.02431 -3.4% +1.2%
bench/pathological_triple_backref 0.00094 0.00094 +0.0% +1.1%
bench/static_nested_quantifier 0.00238 0.00238 +0.0% +0.8%
bench/static_realworld_csv_fields 0.03156 0.03158 +0.1% +0.7%
bench/static_email_search_2KB 0.01196 0.01201 +0.4% +0.7%
bench/positional_group_email 0.00162 0.00156 -3.7% +0.6%
bench/static_ignorecase_search_2KB 0.00844 0.00849 +0.6% +0.6%
bench_set/set_rose_log_sparse_64k 0.01046 0.01009 -3.5% +0.6%
bench_set/set_bitnfa_log_dense_16k 0.04083 0.03926 -3.8% +0.5%
bench/pathological_nested_quantifier_miss 0.83102 0.87041 +4.7% +0.5%
bench/static_nested_groups 0.00245 0.00246 +0.4% +0.4%
bench_set/set_rose_log_sparse_16k 0.00277 0.00266 -4.0% +0.4%
bench_set/set_bitnfa_blowup_dense_16k 0.02411 0.02339 -3.0% +0.2%
bench_set/set_rose_anchors_dense_16k 0.00917 0.0088 -4.0% +0.2%
bench/alternation_16 0.00015 0.00015 +0.0% +0.0%
bench/alternation_16_miss 9e-05 9e-05 +0.0% +0.0%
bench/anchor_bol 0.0002 0.00021 +5.0% +0.0%
bench/anchor_bol_miss_10KB 7e-05 7e-05 +0.0% +0.0%
bench/anchor_eol 0.00067 0.00067 +0.0% +0.0%
bench/anchor_word_boundary_miss 0.00105 0.00105 +0.0% +0.0%
bench/dotall_multiline_body 0.00028 0.00026 -7.1% +0.0%
bench/neg_lookahead 0.00054 0.00053 -1.9% +0.0%
bench/neg_lookbehind 0.00044 0.00042 -4.5% +0.0%
bench/password_validation_lookahead 0.00232 0.00224 -3.4% +0.0%
bench/pathological_dotstar_miss_5K 0.0001 0.0001 +0.0% +0.0%
bench/realworld_hex_color 0.00034 0.00034 +0.0% +0.0%
bench/simd_literal_match 8e-05 8e-05 +0.0% +0.0%
bench/static_bol_alternation_miss_10KB 0.00021 0.0002 -4.8% +0.0%
bench/static_dfa_char_class_26 0.00127 0.00126 -0.8% +0.0%
bench/static_dfa_literal_match 0.00037 0.00037 +0.0% +0.0%
bench/static_ignorecase 0.0008 0.00081 +1.2% +0.0%
bench/static_lookahead_positive 0.00048 0.00048 +0.0% +0.0%
bench/static_search_short_11B 0.00066 0.00064 -3.0% +0.0%
bench_set/set_teddy8_sparse_16k 0.00179 0.00184 +2.8% +0.0%
bench/realworld_html_tag_findall 0.03733 0.03605 -3.4% -0.0%
bench/findall_100_matches 0.1716 0.17536 +2.2% -0.1%
bench_set/set_ac_256_dense_16k 0.03128 0.03129 +0.0% -0.1%
bench/capture_search_miss_100KB 18.7057 18.7258 +0.1% -0.2%
bench/simd_literal_search 0.01101 0.01099 -0.2% -0.2%
bench/split_100_parts 0.16293 0.1652 +1.4% -0.3%
bench_set/set_teddy64_dense_16k 0.00802 0.00805 +0.4% -0.5%
bench_set/set_teddy8_dense_16k 0.00576 0.00577 +0.2% -0.5%
bench_set/set_rose_log_dense_16k 0.02544 0.0245 -3.7% -0.5%
bench/realworld_semver 0.00182 0.00183 +0.5% -0.5%
bench_set/set_teddy64_sparse_16k 0.00174 0.0017 -2.3% -0.6%
bench/static_realworld_email 0.00168 0.00167 -0.6% -0.6%
bench/realworld_log_search_1000_lines 0.1038 0.10372 -0.1% -0.6%
bench/lf_dfa_lazy_findall_64KB 9.96844 9.93025 -0.4% -0.8%
bench/sheng64_alt_32_search_2KB 0.32665 0.31473 -3.6% -0.8%
bench/static_url_search_2KB 0.12573 0.12593 +0.2% -0.9%
bench/throughput_nomatch_100KB 0.12832 0.12749 -0.6% -0.9%
bench/reverse_inner_search_64KB 0.19913 0.19658 -1.3% -1.1%
bench/inline_multiline_search 0.0008 0.00079 -1.3% -1.2%
bench/engine_pike_with_capture 0.00064 0.00064 +0.0% -1.5%
bench/static_backref 0.00064 0.00063 -1.6% -1.5%
bench/word_boundary_findall_64KB 32.6917 31.6757 -3.1% -1.6%
bench_set/set_mdfa_anchors_dense_16k 0.0113 0.01076 -4.8% -1.7%
bench/inline_ignorecase 0.00054 0.00054 +0.0% -1.8%
bench/static_html_tag 0.00105 0.00101 -3.8% -1.9%
bench/multiline_bol_findall_100_lines 0.17757 0.17196 -3.2% -1.9%
bench/throughput_literal_1MB 1.34079 1.31123 -2.2% -1.9%
bench_set/set_rose_full_dense_16k 0.02005 0.01988 -0.8% -1.9%
bench_set/set_mdfa_full_dense_16k 0.02688 0.02564 -4.6% -2.1%
bench/named_group_date 0.00047 0.00045 -4.3% -2.1%
bench/static_lazy_tag 0.00091 0.00088 -3.3% -2.2%
bench/throughput_literal_10KB 0.01375 0.01349 -1.9% -2.2%
bench/static_replace_alternation 0.12536 0.12211 -2.6% -2.2%
bench/engine_dfa_no_capture 0.00045 0.00044 -2.2% -2.2%
bench/static_ignorecase_alternation_2KB 0.02204 0.02191 -0.6% -2.2%
bench/onepass_findall_2KB 1.12606 1.07011 -5.0% -2.3%
bench/static_search_medium_1KB 0.00112 0.0011 -1.8% -2.6%
bench/memo_ambiguous_plus_in_span_1500 17.6453 18.0723 +2.4% -2.7%
bench/onepass_match_kv 0.01055 0.01023 -3.0% -2.8%
bench/named_group_email 0.00105 0.00101 -3.8% -2.9%
bench/static_search_miss_10KB 0.01354 0.01287 -4.9% -3.0%
bench/static_replace_with_backref 0.02347 0.02357 +0.4% -3.3%
bench/realworld_ws_normalize 0.01648 0.01637 -0.7% -3.4%
bench/throughput_literal_100KB 0.12844 0.12349 -3.9% -3.6%
bench_set/set_ac_256_sparse_64k 0.0111 0.01091 -1.7% -3.7%
bench/match_single_byte_run_20KB 0.11071 0.10827 -2.2% -3.7%
bench/static_teddy_prefix_search_2KB 0.02367 0.02373 +0.3% -3.9%
bench/multiline_eol_findall_100_lines 0.84706 0.8156 -3.7% -4.1%
bench/static_dotstar_search_1K 0.00664 0.00655 -1.4% -4.4%
bench/static_split_delimiters 0.02994 0.02934 -2.0% -4.4%
bench/counted_repeat_search_2KB 0.5762 0.54496 -5.4% -4.8%
bench/static_email_search_long_tokens 0.00966 0.0095 -1.7% -5.1%
bench/static_search_date_capture 0.00183 0.00175 -4.4% -5.4%
bench_set/set_mdfa_full_sparse_64k 0.10682 0.10315 -3.4% -5.4%
bench/alternation_4 0.00017 0.00017 +0.0% -5.6%
bench/static_search_long_20KB 0.0144 0.01395 -3.1% -5.6%
bench/static_dotstar_1K 0.00344 0.00342 -0.6% -5.8%
bench/static_explicit_case_range 0.0008 0.0008 +0.0% -5.9%
bench/static_replace_numbers 0.02045 0.02003 -2.1% -6.1%
bench/static_findall_numbers 0.03112 0.02913 -6.4% -6.4%
bench/pathological_pike_search_miss_600B 0.0017 0.00169 -0.6% -6.6%
bench/pathological_dotstar_anchored_5K 0.01558 0.01559 +0.1% -7.0%
bench/engine_backtrack_with_backref 0.00083 0.00077 -7.2% -11.2%

@bgreni
bgreni merged commit 1f4debb into main Sep 24, 2026
4 of 6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant