Skip to content
Snippets Groups Projects
  • Raphaël Gomès's avatar
    f4aede0f
    rust-manifest: use `memchr` crate for all byte-finding needs · f4aede0f
    Raphaël Gomès authored
    While writing a very dumb manifest diffing algorithm for a proof-of-concept
    I saw that `Manifest::find_by_path` was much slower than I was expecting.
    
    It turns out that the Rust stdlib uses slow (all is relative) code when
    searching for byte positions for reasons ranging from portability, SIMD
    API stability, nobody doing the work, etc. `memch` is much faster for these
    purposes, so let's use it.
    
    I was measuring ~670ms of profile time in `find_by_path`, after this patch
    it went down to ~230ms.
    f4aede0f
    History
    rust-manifest: use `memchr` crate for all byte-finding needs
    Raphaël Gomès authored
    While writing a very dumb manifest diffing algorithm for a proof-of-concept
    I saw that `Manifest::find_by_path` was much slower than I was expecting.
    
    It turns out that the Rust stdlib uses slow (all is relative) code when
    searching for byte positions for reasons ranging from portability, SIMD
    API stability, nobody doing the work, etc. `memch` is much faster for these
    purposes, so let's use it.
    
    I was measuring ~670ms of profile time in `find_by_path`, after this patch
    it went down to ~230ms.
This project manages its dependencies using Cargo. Learn more
Cargo.toml 1.42 KiB
[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 = "2021"

[lib]
name = "hg"

[dependencies]
bitflags = "1.3.2"
bytes-cast = "0.3.0"
byteorder = "1.4.3"
ctrlc = "3.4"
derive_more = "0.99.17"
hashbrown = { version = "0.13.1", features = ["rayon"] }
home = "0.5.4"
im-rc = "15.1.0"
indicatif = "0.17.8"
itertools = "0.10.5"
lazy_static = "1.4.0"
libc = "0.2.137"
logging_timer = "1.1.0"
memchr = "2"
rand = "0.8.5"
rand_pcg = "0.3.1"
rand_distr = "0.4.3"
rayon = "1.7.0"
regex = "1.7.0"
self_cell = "1.0"
serde = { version = "1.0", features = ["derive"] }
sha-1 = "0.10.0"
twox-hash = "1.6.3"
same-file = "1.0.6"
tempfile = "3.3.0"
toml = "0.6"
thread_local = "1.1.4"
crossbeam-channel = "0.5.6"
log = "0.4.17"
memmap2 = { version = "0.5.8", features = ["stable_deref_trait"] }
zstd = "0.12"
format-bytes = "0.3.0"
once_cell = "1.16.0"
bitvec = "1.0.1"
chrono = "0.4.34"
schnellru = "0.2.1"
dyn-clone = "1.0.16"
filetime = "0.2.23"
uuid = { version = "1.10", features = ["v4"] }

# 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.24"
features = ["zlib"]
default-features = false

[dev-dependencies]
clap = { version = "~4.0", features = ["derive"] }
pretty_assertions = "1.1.0"