5de4cc5608 (master): Fix regexp performance regression for patterns starting with s/k

0 views
Skip to first unread message

Chris Hasiński

unread,
Jan 12, 2026, 8:20:10 PMJan 12
to ruby...@g.ruby-lang.org
Chris Hasiński 2026-01-11 13:12:07 +0000 (Sun, 11 Jan 2026)

New Revision: 5de4cc5608

https://github.com/ruby/ruby/commit/5de4cc5608

Log:
Fix regexp performance regression for patterns starting with s/k

Commit 981ee02c7c ("Fix performance problem with /k/i and /s/i") was
merged for Ruby 4.0 to enable partial Boyer-Moore optimization for
patterns containing 's' or 'k' by using the prefix before those
characters.

However, when 's' or 'k' appears at the start of a pattern (no usable
prefix), set_bm_skip() returns 0 and the code returned early without
setting any optimization mode, leaving reg->optimize at
ONIG_OPTIMIZE_NONE. This caused up to 30x slowdown for patterns like
/slackware/i when matched against strings with non-ASCII characters.

This patch keeps the improvement from 981ee02c7c for patterns with
3+ char prefix, while fixing the regression by falling back to
ONIG_OPTIMIZE_EXACT_IC with the full pattern when the usable prefix
is less than 3 characters.

Before: /\bslackware\b/i with non-ASCII string: 2.24 us/op
After: /\bslackware\b/i with non-ASCII string: 0.70 us/op (3.2x faster)

[Bug #21824]

Modified files:
regcomp.c
Reply all
Reply to author
Forward
0 new messages