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"