From 91692846909ed191addb7ec1c34aad11392ab88b Mon Sep 17 00:00:00 2001 From: nsfisis Date: Sat, 18 Jul 2026 15:03:55 +0900 Subject: perf(regex): eliminate per-call clone overhead in preg_* dispatch regex::Regex::clone() does not share the underlying meta engine's search-cache pool, so every fresh clone pays a ~10us warmup cost on its first use. Two changes together eliminate this across nearly all preg_* call sites: - A php_regex! macro resolves PHP-style patterns to a per-call-site &'static regex::Regex (via regex-macro's LazyLock), applied at the majority of call sites throughout the codebase. - Call sites still passing dynamic pattern strings go through PATTERN_CACHE, which now stores Arc<(Regex, bool)> and hands out Arc::clone()s instead of cloning the Regex itself. PregPattern::resolve() returns a ResolvedPattern enum (Arc or 'static reference) rather than an owned Regex, so neither path ever clones the Regex proper. Co-Authored-By: Claude Sonnet 5 --- crates/shirabe/src/util/platform.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'crates/shirabe/src/util/platform.rs') diff --git a/crates/shirabe/src/util/platform.rs b/crates/shirabe/src/util/platform.rs index 45ddb306..81f2adbb 100644 --- a/crates/shirabe/src/util/platform.rs +++ b/crates/shirabe/src/util/platform.rs @@ -6,7 +6,7 @@ use shirabe_external_packages::composer::pcre::Preg; use shirabe_php_shim::{ PHP_ENV, PHP_SERVER, PhpMixed, PhpResource, RuntimeException, defined, file_exists, file_get_contents, fstat, function_exists, getcwd, getenv, in_array, ini_get, is_array, - is_readable, mb_strlen, php_os_family, posix_geteuid, posix_getpwuid, posix_getuid, + is_readable, mb_strlen, php_os_family, php_regex, posix_geteuid, posix_getpwuid, posix_getuid, posix_isatty, putenv, putenv_clear, realpath, stream_isatty, stripos, strlen, strtoupper, substr, usleep, }; @@ -90,7 +90,7 @@ impl Platform { /// Parses tildes and environment variables in paths. pub fn expand_path(path: &str) -> String { use shirabe_external_packages::composer::pcre::CaptureKey; - if Preg::is_match(r"#^~[\\/]#", path) { + if Preg::is_match(php_regex!(r"#^~[\\/]#"), path) { return format!( "{}{}", Self::get_user_directory().unwrap(), @@ -103,7 +103,7 @@ impl Platform { // only for the `%VAR%` form. The Rust regex crate does not support conditionals, so the // two forms are written as an explicit alternation: `$VAR` or `%VAR%`. Preg::replace_callback( - r"#^(?:\$(?P\w+)|%(?P\w+)%)(?P.*)#", + php_regex!(r"#^(?:\$(?P\w+)|%(?P\w+)%)(?P.*)#"), |matches: &indexmap::IndexMap| -> String { let var = matches .get(&CaptureKey::ByName("dvar".to_string())) -- cgit v1.3.1