##// END OF EJS Templates
dirstate-tree: Fold "tracked descendants" counter update in main walk...
dirstate-tree: Fold "tracked descendants" counter update in main walk For the purpose of implementing `has_tracked_dir` (which means "has tracked descendants) without an expensive sub-tree traversal, we maintaing a counter of tracked descendants on each "directory" node of the tree-shaped dirstate. Before this changeset, mutating or inserting a node at a given path would involve: * Walking the tree from root through ancestors to find the node or the spot where to insert it * Looking at the previous node if any to decide what counter update is needed * Performing any node mutation * Walking the tree *again* to update counters in ancestor nodes When profiling `hg status` on a large repo, this second walk takes times while loading a the dirstate from disk. It turns out we have enough information to decide before he first tree walk what counter update is needed. This changeset merges the two walks, gaining ~10% of the total time for `hg update` (in the same hyperfine benchmark as the previous changeset). --- Profiling was done by compiling with this `.cargo/config`: [profile.release] debug = true then running with: py-spy record -r 500 -n -o /tmp/hg.json --format speedscope -- \ ./hg status -R $REPO --config experimental.dirstate-tree.in-memory=1 then visualizing the recorded JSON file in https://www.speedscope.app/ Differential Revision: https://phab.mercurial-scm.org/D10554

File last commit:

r47883:be579775 default
r47890:7109a388 default
Show More
Cargo.toml
44 lines | 942 B | application/toml | TOMLLexer
[package]
name = "hg-core"
version = "0.1.0"
authors = ["Georges Racinet <gracinet@anybox.fr>"]
description = "Mercurial pure Rust core library, with no assumption on Python bindings (FFI)"
edition = "2018"
[lib]
name = "hg"
[dependencies]
bytes-cast = "0.2"
byteorder = "1.3.4"
derive_more = "0.99"
home = "0.5"
im-rc = "15.0.*"
itertools = "0.9"
lazy_static = "1.4.0"
rand = "0.7.3"
rand_pcg = "0.2.1"
rand_distr = "0.2.2"
rayon = "1.3.0"
regex = "1.3.9"
twox-hash = "1.5.0"
same-file = "1.0.6"
crossbeam-channel = "0.4"
micro-timer = "0.3.0"
log = "0.4.8"
memmap = "0.7.0"
zstd = "0.5.3"
rust-crypto = "0.2.36"
format-bytes = "0.2.2"
# We don't use the `miniz-oxide` backend to not change rhg benchmarks and until
# we have a clearer view of which backend is the fastest.
[dependencies.flate2]
version = "1.0.16"
features = ["zlib"]
default-features = false
[dev-dependencies]
clap = "*"
pretty_assertions = "0.6.1"
tempfile = "3.1.0"