Mercurial > hg
annotate rust/hg-core/Cargo.toml @ 47120:7109a38830c9
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
author | Simon Sapin <simon.sapin@octobus.net> |
---|---|
date | Fri, 30 Apr 2021 14:22:14 +0200 |
parents | be579775c2d9 |
children | 7138c863d0a1 |
rev | line source |
---|---|
40271
dbc28c91f7ff
rust: pure Rust lazyancestors iterator
Georges Racinet <gracinet@anybox.fr>
parents:
diff
changeset
|
1 [package] |
dbc28c91f7ff
rust: pure Rust lazyancestors iterator
Georges Racinet <gracinet@anybox.fr>
parents:
diff
changeset
|
2 name = "hg-core" |
dbc28c91f7ff
rust: pure Rust lazyancestors iterator
Georges Racinet <gracinet@anybox.fr>
parents:
diff
changeset
|
3 version = "0.1.0" |
dbc28c91f7ff
rust: pure Rust lazyancestors iterator
Georges Racinet <gracinet@anybox.fr>
parents:
diff
changeset
|
4 authors = ["Georges Racinet <gracinet@anybox.fr>"] |
dbc28c91f7ff
rust: pure Rust lazyancestors iterator
Georges Racinet <gracinet@anybox.fr>
parents:
diff
changeset
|
5 description = "Mercurial pure Rust core library, with no assumption on Python bindings (FFI)" |
42609
326fdce22fb2
rust: switch hg-core and hg-cpython to rust 2018 edition
Raphaël Gomès <rgomes@octobus.net>
parents:
42331
diff
changeset
|
6 edition = "2018" |
40271
dbc28c91f7ff
rust: pure Rust lazyancestors iterator
Georges Racinet <gracinet@anybox.fr>
parents:
diff
changeset
|
7 |
dbc28c91f7ff
rust: pure Rust lazyancestors iterator
Georges Racinet <gracinet@anybox.fr>
parents:
diff
changeset
|
8 [lib] |
dbc28c91f7ff
rust: pure Rust lazyancestors iterator
Georges Racinet <gracinet@anybox.fr>
parents:
diff
changeset
|
9 name = "hg" |
41692
ee7b7bd432a1
rust: translated random test of missingancestors
Georges Racinet <gracinet@anybox.fr>
parents:
40271
diff
changeset
|
10 |
42302
d1786c1d34fa
rust-dirstate: add rust implementation of `parse_dirstate` and `pack_dirstate`
Raphaël Gomès <rgomes@octobus.net>
parents:
41692
diff
changeset
|
11 [dependencies] |
47102
d6c94ca40863
dirstate-tree: Serialize to disk
Simon Sapin <simon.sapin@octobus.net>
parents:
46890
diff
changeset
|
12 bytes-cast = "0.2" |
44599
d31d1c0685be
rust: update all dependencies
Raphaël Gomès <rgomes@octobus.net>
parents:
44598
diff
changeset
|
13 byteorder = "1.3.4" |
46435
2e2033081274
rust: replace trivial `impl From …` with `#[derive(derive_more::From)]`
Simon Sapin <simon.sapin@octobus.net>
parents:
46431
diff
changeset
|
14 derive_more = "0.99" |
46483
2845892dd489
rust: Parse system and user configuration
Simon Sapin <simon.sapin@octobus.net>
parents:
46435
diff
changeset
|
15 home = "0.5" |
45963
0d99778af68a
copies-rust: use immutable "OrdMap" to store copies information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45614
diff
changeset
|
16 im-rc = "15.0.*" |
47113
be579775c2d9
dirstate-tree: Add the new `status()` algorithm
Simon Sapin <simon.sapin@octobus.net>
parents:
47102
diff
changeset
|
17 itertools = "0.9" |
44599
d31d1c0685be
rust: update all dependencies
Raphaël Gomès <rgomes@octobus.net>
parents:
44598
diff
changeset
|
18 lazy_static = "1.4.0" |
d31d1c0685be
rust: update all dependencies
Raphaël Gomès <rgomes@octobus.net>
parents:
44598
diff
changeset
|
19 rand = "0.7.3" |
d31d1c0685be
rust: update all dependencies
Raphaël Gomès <rgomes@octobus.net>
parents:
44598
diff
changeset
|
20 rand_pcg = "0.2.1" |
d31d1c0685be
rust: update all dependencies
Raphaël Gomès <rgomes@octobus.net>
parents:
44598
diff
changeset
|
21 rand_distr = "0.2.2" |
44158
161958ebf73c
rust-dependencies: update rayon
Raphaël Gomès <rgomes@octobus.net>
parents:
44143
diff
changeset
|
22 rayon = "1.3.0" |
44869
4313a0d7540d
rust-dependencies: update `regex` to 1.3.9
Raphaël Gomès <rgomes@octobus.net>
parents:
44599
diff
changeset
|
23 regex = "1.3.9" |
43826
5ac243a92e37
rust-performance: introduce FastHashMap type alias for HashMap
Raphaël Gomès <rgomes@octobus.net>
parents:
43271
diff
changeset
|
24 twox-hash = "1.5.0" |
44301
4caac36c66bc
rust-utils: add util for canonical path
Raphaël Gomès <rgomes@octobus.net>
parents:
44266
diff
changeset
|
25 same-file = "1.0.6" |
46054
fd47483f1645
rust: use crossbeam-channel crate directly
Simon Sapin <simon-commits@exyr.org>
parents:
45963
diff
changeset
|
26 crossbeam-channel = "0.4" |
44935
2093b2fc70d4
rust-dependencies: upgrade `micro-timer` dependency
Raphaël Gomès <rgomes@octobus.net>
parents:
44870
diff
changeset
|
27 micro-timer = "0.3.0" |
44540
82f51ab7a2dd
rust: add logging utils
Raphaël Gomès <rgomes@octobus.net>
parents:
44539
diff
changeset
|
28 log = "0.4.8" |
45526
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
44935
diff
changeset
|
29 memmap = "0.7.0" |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
44935
diff
changeset
|
30 zstd = "0.5.3" |
45531
b0d6309ff50c
hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45526
diff
changeset
|
31 rust-crypto = "0.2.36" |
46735
12d59eec7f1d
rhg: Align with Python on some more error messages
Simon Sapin <simon.sapin@octobus.net>
parents:
46594
diff
changeset
|
32 format-bytes = "0.2.2" |
45526
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
44935
diff
changeset
|
33 |
45614
7bd13bf99d1c
rust: update minimum supported Rust compiler version
Raphaël Gomès <rgomes@octobus.net>
parents:
45609
diff
changeset
|
34 # We don't use the `miniz-oxide` backend to not change rhg benchmarks and until |
7bd13bf99d1c
rust: update minimum supported Rust compiler version
Raphaël Gomès <rgomes@octobus.net>
parents:
45609
diff
changeset
|
35 # we have a clearer view of which backend is the fastest. |
45526
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
44935
diff
changeset
|
36 [dependencies.flate2] |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
44935
diff
changeset
|
37 version = "1.0.16" |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
44935
diff
changeset
|
38 features = ["zlib"] |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
44935
diff
changeset
|
39 default-features = false |
44265
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Raphaël Gomès <rgomes@octobus.net>
parents:
44158
diff
changeset
|
40 |
c18dd48cea4a
rust-pathauditor: add Rust implementation of the `pathauditor`
Raphaël Gomès <rgomes@octobus.net>
parents:
44158
diff
changeset
|
41 [dev-dependencies] |
44386
8f7c6656ac79
rust-nodemap: pure Rust example
Georges Racinet <georges.racinet@octobus.net>
parents:
44305
diff
changeset
|
42 clap = "*" |
8f7c6656ac79
rust-nodemap: pure Rust example
Georges Racinet <georges.racinet@octobus.net>
parents:
44305
diff
changeset
|
43 pretty_assertions = "0.6.1" |
44266
9ab4830e9e3d
rust-hg-path: add useful methods to `HgPath`
Raphaël Gomès <rgomes@octobus.net>
parents:
44265
diff
changeset
|
44 tempfile = "3.1.0" |