Skip to content

perf: hoist shell normalisation and cache notification regex objects#39

Merged
shanselman merged 1 commit intomasterfrom
repo-assist/improve-exec-notify-perf-2026-03-17-04ada35e031dac93
Mar 17, 2026
Merged

perf: hoist shell normalisation and cache notification regex objects#39
shanselman merged 1 commit intomasterfrom
repo-assist/improve-exec-notify-perf-2026-03-17-04ada35e031dac93

Conversation

@shanselman
Copy link
Copy Markdown
Collaborator

Two targeted performance improvements to hot-path code in OpenClaw.Shared, originally identified by Repo Assist (#34).

1. ExecApprovalPolicy.Evaluate — hoist shell normalisation

normalizedShell was allocated inside the foreach loop once per rule with a shell filter. Moved before the loop — one allocation instead of N.

2. NotificationCategorizer.MatchesRule — cache compiled Regex instances

The Regex.IsMatch overload with matchTimeout bypasses .NET's internal static regex cache. Replaced with a ConcurrentDictionary<string, Regex?> that caches compiled instances. ReDoS timeout (100ms) preserved. Invalid patterns stored as null so RegexParseException only thrown once.

All 432 tests pass. No behaviour changes.

Closes #34

ExecApprovalPolicy.Evaluate: normalizedShell was allocated inside the
foreach loop for every rule that carries a shell filter.  Moving the
computation before the loop avoids the repeated allocation on the hot
command-evaluation path.

NotificationCategorizer.MatchesRule: the static Regex.IsMatch overload
that accepts a matchTimeout bypasses .NET's internal regex cache, so a
new Regex object was compiled on every incoming notification for each
regex-pattern user rule.  Replace with a ConcurrentDictionary<string,
Regex?> that caches compiled instances (constructed with the 100 ms
timeout so ReDoS protection is preserved).  Subsequent notifications
reuse the same compiled automaton.
@shanselman shanselman merged commit 530f645 into master Mar 17, 2026
14 checks passed
@shanselman shanselman deleted the repo-assist/improve-exec-notify-perf-2026-03-17-04ada35e031dac93 branch March 17, 2026 01:38
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.

[Repo Assist] perf: hoist shell normalisation and cache notification regex objects

1 participant