From ed000d0dd567399cbef4df0151866e6b2f179584 Mon Sep 17 00:00:00 2001 From: Andrew Gallant Date: Wed, 14 Feb 2024 13:46:53 -0500 Subject: [PATCH] puffin-resolver: add singleton fast path In many cases, version ranges are actually just pins to a specific and single version. And we can detect that statically by examining the range. If we do have a range that is just one version, then we can ask a `VersionMap` for just that version instead of iterating over what's in the map until we find one that satisfies the range. I had tried this before making `VersionMap` construction lazy, but it didn't seem to matter much. But helps a lot more now with a lazy `VersionMap` because it lets us avoid creating a lot of distributions in memory that we won't ultimately use. --- crates/puffin-resolver/src/candidate_selector.rs | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/crates/puffin-resolver/src/candidate_selector.rs b/crates/puffin-resolver/src/candidate_selector.rs index b2765fe99..c2cfa4066 100644 --- a/crates/puffin-resolver/src/candidate_selector.rs +++ b/crates/puffin-resolver/src/candidate_selector.rs @@ -96,7 +96,7 @@ impl CandidateSelector { pub(crate) fn select<'a>( &'a self, package_name: &'a PackageName, - range: &Range, + range: &'a Range, version_map: &'a VersionMap, ) -> Option> { // If the package has a preference (e.g., an existing version from an existing lockfile), @@ -130,6 +130,19 @@ impl CandidateSelector { } }; + if let Some(version) = range.as_singleton() { + if !version.any_prerelease() { + let maybe_dist_with_version = version_map.get_with_version(version); + tracing::trace!( + "range {:?} for package {:?} has exactly one version, found? {:?}", + range, + package_name, + maybe_dist_with_version.is_some(), + ); + return maybe_dist_with_version + .map(|(version, dist)| Candidate::new(package_name, version, dist)); + } + } tracing::trace!( "selecting candidate for package {:?} with range {:?} with {} versions", package_name,