Mercurial > hg
view rust/hg-core/Cargo.toml @ 48950:11c0411bf4e2
dirstate-tree: optimize HashMap lookups with raw_entry_mut
This switches to using `HashMap` from the hashbrown crate,
in order to use its `raw_entry_mut` method.
The standard library’s `HashMap` is also based on this same crate,
but `raw_entry_mut` is not yet stable there:
https://github.com/rust-lang/rust/issues/56167
Using version 0.9 because 0.10 is yanked and 0.11 requires Rust 1.49
This replaces in `DirstateMap::get_or_insert_node` a call to
`HashMap<K, V>::entry` with `K = WithBasename<Cow<'on_disk, HgPath>>`.
`entry` takes and consumes an "owned" `key: K` parameter, in case a new entry
ends up inserted. This key is converted by `to_cow` from a value that borrows
the `'path` lifetime.
When this function is called by `Dirstate::new_v1`, `'path` is in fact
the same as `'on_disk` so `to_cow` can return an owned key that contains
`Cow::Borrowed`.
For other callers, `to_cow` needs to create a `Cow::Owned` and thus make
a costly heap memory allocation. This is wasteful if this key was already
present in the map. Even when inserting a new node this is typically the case
for its ancestor nodes (assuming most directories have numerous descendants).
Differential Revision: https://phab.mercurial-scm.org/D12317
author | Simon Sapin <simon.sapin@octobus.net> |
---|---|
date | Tue, 08 Feb 2022 15:51:52 +0100 |
parents | 0dc698c91ca0 |
children | ec8d9b5a5e7c |
line wrap: on
line source
[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] bitflags = "1.2" bytes-cast = "0.2" byteorder = "1.3.4" derive_more = "0.99" hashbrown = {version = "0.9.1", features = ["rayon"]} home = "0.5" im-rc = "15.0.*" itertools = "0.9" lazy_static = "1.4.0" libc = "0.2" rand = "0.8.4" rand_pcg = "0.3.1" rand_distr = "0.4.2" rayon = "1.3.0" regex = "1.3.9" sha-1 = "0.9.6" twox-hash = "1.5.0" same-file = "1.0.6" stable_deref_trait = "1.2.0" tempfile = "3.1.0" crossbeam-channel = "0.4" micro-timer = "0.3.0" log = "0.4.8" memmap2 = {version = "0.4", features = ["stable_deref_trait"]} zstd = "0.5.3" format-bytes = "0.3.0" # 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"