Mercurial > public > mercurial-scm > hg-stable
diff rust/hg-core/src/revlog/index.rs @ 52009:609700e5d8df
head-revs: add a native implementation of the `stop_rev` parameter
This does not add too much complexity to the native code and help with
branchmap v3 performance.
Note that the final conversion of the heads from native-code to Python is still
too costly, especially in Rust. In addition the current caching around headrevs
is too simple and fragile. However these are an unrelated problem.
### benchmark.name = hg.command.unbundle
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.issue6528 = disabled
# benchmark.variants.resource-usage = default
# benchmark.variants.reuse-external-delta-parent = yes
# benchmark.variants.revs = any-1-extra-rev
# benchmark.variants.source = unbundle
# benchmark.variants.validate = default
# benchmark.variants.verbosity = quiet
## data-env-vars.name = netbeans-2018-08-01-zstd-sparse-revlog
# bin-env-vars.hg.flavor = default
branch-v2: 0.233711 ~~~~~
branch-v3 before: 0.239857 (+2.63%, +0.01)
branch-v3 after: 0.239558 (+2.50%, +0.01)
# bin-env-vars.hg.flavor = rust
branch-v2: 0.235230 ~~~~~
branch-v3 before: 0.240972 (+2.44%, +0.01)
branch-v3 after: 0.239917 (+1.99%, +0.00)
## data-env-vars.name = netbeans-2018-08-01-ds2-pnm
# bin-env-vars.hg.flavor = rust
branch-v2: 0.255586 ~~~~~
branch-v3 before: 0.268560 (+5.08%, +0.01)
branch-v3 after: 0.262261 (+2.61%, +0.01)
## data-env-vars.name = mozilla-central-2024-03-22-zstd-sparse-revlog
# bin-env-vars.hg.flavor = default
branch-v2: 0.339010 ~~~~~
branch-v3 before: 0.349389 (+3.06%, +0.01)
branch-v3 after: 0.348247 (+2.72%, +0.01)
# bin-env-vars.hg.flavor = rust
branch-v2: 0.346525 ~~~~~
branch-v3 before: 0.355661 (+2.64%, +0.01)
branch-v3 after: 0.350906 (+1.26%, +0.00)
## data-env-vars.name = mozilla-central-2024-03-22-ds2-pnm
# bin-env-vars.hg.flavor = rust
branch-v2: 0.380202 ~~~~~
branch-v3 before: 0.408851 (+7.54%, +0.03)
branch-v3 after: 0.406511 (+6.92%, +0.03)
## data-env-vars.name = mozilla-unified-2024-03-22-zstd-sparse-revlog
# bin-env-vars.hg.flavor = default
branch-v2: 0.412165 ~~~~~
branch-v3 before: 0.427782 (+3.79%, +0.02)
branch-v3 after: 0.422595 (+2.53%, +0.01)
# bin-env-vars.hg.flavor = rust
branch-v2: 0.412397 ~~~~~
branch-v3 before: 0.422354 (+2.41%, +0.01)
branch-v3 after: 0.421079 (+2.11%, +0.01)
## data-env-vars.name = mozilla-unified-2024-03-22-ds2-pnm
# bin-env-vars.hg.flavor = rust
branch-v2: 0.429501 ~~~~~
branch-v3 before: 0.443197 (+3.19%, +0.01)
branch-v3 after: 0.449432 (+4.64%, +0.02)
## data-env-vars.name = mozilla-try-2024-03-26-zstd-sparse-revlog
# bin-env-vars.hg.flavor = default
branch-v2: 3.403171 ~~~~~
branch-v3 before: 3.819477 (+12.23%, +0.42)
branch-v3 after: 3.658482 (+7.50%, +0.26)
# bin-env-vars.hg.flavor = rust
branch-v2: 3.454876 ~~~~~
branch-v3 before: 3.590284 (+3.92%, +0.14)
branch-v3 after: 3.545843 (+2.63%, +0.09)
## data-env-vars.name = mozilla-try-2024-03-26-ds2-pnm
# bin-env-vars.hg.flavor = rust
branch-v2: 3.465435 ~~~~~
branch-v3 before: 3.633278 (+4.84%, +0.17)
branch-v3 after: 3.556074 (+2.62%, +0.09)
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Fri, 27 Sep 2024 03:55:40 +0200 |
parents | 5d1e6f447d2d |
children | 652149ed64f0 |
line wrap: on
line diff
--- a/rust/hg-core/src/revlog/index.rs Thu Sep 26 01:52:09 2024 +0200 +++ b/rust/hg-core/src/revlog/index.rs Fri Sep 27 03:55:40 2024 +0200 @@ -541,14 +541,15 @@ /// Return the head revisions of this index pub fn head_revs(&self) -> Result<Vec<Revision>, GraphError> { - self.head_revs_filtered(&HashSet::new(), false) + self.head_revs_advanced(&HashSet::new(), None, false) .map(|h| h.unwrap()) } /// Return the head revisions of this index - pub fn head_revs_filtered( + pub fn head_revs_advanced( &self, filtered_revs: &HashSet<Revision>, + stop_rev: Option<Revision>, py_shortcut: bool, ) -> Result<Option<Vec<Revision>>, GraphError> { { @@ -560,6 +561,7 @@ let self_filtered_revs = &guard.1; if !self_head_revs.is_empty() && filtered_revs == self_filtered_revs + && stop_rev.is_none() { if py_shortcut { // Don't copy the revs since we've already cached them @@ -571,32 +573,42 @@ } } - let as_vec = if self.is_empty() { - vec![NULL_REVISION] + let (as_vec, cachable) = if self.is_empty() { + (vec![NULL_REVISION], true) } else { - let mut not_heads = bitvec![0; self.len()]; + let length: usize = match stop_rev { + Some(r) => r.0 as usize, + None => self.len(), + }; + let cachable = self.len() == length; + let mut not_heads = bitvec![0; length]; dagops::retain_heads_fast( self, not_heads.as_mut_bitslice(), filtered_revs, )?; - not_heads - .into_iter() - .enumerate() - .filter_map(|(idx, is_not_head)| { - if is_not_head { - None - } else { - Some(Revision(idx as BaseRevision)) - } - }) - .collect() + ( + not_heads + .into_iter() + .enumerate() + .filter_map(|(idx, is_not_head)| { + if is_not_head { + None + } else { + Some(Revision(idx as BaseRevision)) + } + }) + .collect(), + cachable, + ) }; - *self - .head_revs - .write() - .expect("RwLock on Index.head_revs should not be poisoned") = - (as_vec.to_owned(), filtered_revs.to_owned()); + if cachable { + *self + .head_revs + .write() + .expect("RwLock on Index.head_revs should not be poisoned") = + (as_vec.to_owned(), filtered_revs.to_owned()); + } Ok(Some(as_vec)) } @@ -604,7 +616,7 @@ pub fn head_revs_shortcut( &self, ) -> Result<Option<Vec<Revision>>, GraphError> { - self.head_revs_filtered(&HashSet::new(), true) + self.head_revs_advanced(&HashSet::new(), None, true) } /// Return the heads removed and added by advancing from `begin` to `end`.