From 80c2120a64ce9b989da288ce1fcf80dec5cf38c1 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Thu, 20 Aug 2026 01:54:09 +0900 Subject: perf(semver): build CompilingMatcher's cache key without allocating CompilingMatcher::match formats `;` into a fresh String on every call, including the cache hits the key exists to serve. Profiling put the formatting at 2.9 % of self time, more than the match it guards. Build the key into a reused thread-local buffer and copy it only when there is a miss to record. Taking the version as `&str` rather than `String` removes the copy the callers made for the same reason: `optimize_by_identical_dependencies` allocated one per candidate package in its innermost loop. laravel/framework require --no-install (warm cache, network disabled): instructions:u 9142799608 -> 8895247586 (-2.7 %) cycles:u 4626440169 -> 4496152041 (-2.8 %) wall (hyperfine, 25 runs) 1.239 s +- 0.014 s -> 1.227 s +- 0.016 s (-1.0 %) monolog/monolog is unchanged (102.1 ms -> 101.6 ms, within noise). composer.lock is byte-identical for both packages. Co-Authored-By: Claude Opus 5 (1M context) --- crates/shirabe/src/dependency_resolver/pool_optimizer.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'crates/shirabe/src/dependency_resolver/pool_optimizer.rs') diff --git a/crates/shirabe/src/dependency_resolver/pool_optimizer.rs b/crates/shirabe/src/dependency_resolver/pool_optimizer.rs index c71feb4d..b06cdd54 100644 --- a/crates/shirabe/src/dependency_resolver/pool_optimizer.rs +++ b/crates/shirabe/src/dependency_resolver/pool_optimizer.rs @@ -156,7 +156,7 @@ impl PoolOptimizer { let constraint = irremovable_package_constraints .get(&package.get_name()) .unwrap(); - if CompilingMatcher::r#match(constraint, CmpOp::Eq, package.get_version().to_string()) { + if CompilingMatcher::r#match(constraint, CmpOp::Eq, &package.get_version()) { self.mark_package_irremovable(package.clone()); } } @@ -249,7 +249,7 @@ impl PoolOptimizer { if CompilingMatcher::r#match( require_constraint, CmpOp::Eq, - package.get_version().to_string(), + &package.get_version(), ) { group_hash_parts.push(format!( "require:{}", @@ -262,7 +262,7 @@ impl PoolOptimizer { if CompilingMatcher::r#match( link.get_constraint(), CmpOp::Eq, - package.get_version().to_string(), + &package.get_version(), ) { // Use the same hash part as the regular require hash because that's what the replacement does group_hash_parts.push(format!( @@ -280,7 +280,7 @@ impl PoolOptimizer { if CompilingMatcher::r#match( conflict_constraint, CmpOp::Eq, - package.get_version().to_string(), + &package.get_version(), ) { group_hash_parts.push(format!( "conflict:{}", @@ -601,7 +601,7 @@ impl PoolOptimizer { .and_then(|m| m.get(&id)) .map(|p| p.get_version()); if let Some(version_str) = version_str - && !CompilingMatcher::r#match(link_constraint, CmpOp::Eq, version_str) + && !CompilingMatcher::r#match(link_constraint, CmpOp::Eq, &version_str) { self.mark_package_for_removal(id); if let Some(map) = package_index.get_mut(require) { -- cgit v1.3.1-4-g156e