Note: This crate is still in early development and undergoing API changes. Contributions, feature requests, and constructive feedback are warmly welcomed.

sharded   ![Build] ![Crate]

Sharded provides safe, fast, and obvious concurrent collections in Rust. This crate splits the underlying collection into N shards each with its own lock. Calling read(&key) or write(&key) returns a guard for a single shard. For further reading on the strategy, see a write up on C++'s parallel-hashmap.

Features

See Also

Quick Start

```toml [dependencies]

Optionally use parking_lot, ahash, fxhash, and xxhash

by specifing the feature by the same name e.g.

sharded = { version = "0.1.0", features = ["fxhash", "parking_lot"] } ```

Examples

Insert a key value pair

rust let users = Map::new(); users.insert(32, "Henry");

Access a storage shard

Map provides read and write which give access to the underlying storage (which is built using hashbrown::raw). Both methods return a tuple of (Key, Guard<Shard>)

rust let (key, shard) = users.read(&32); assert_eq!(shard.get(key), Some(&"Henry"));

Determine if a storage shard is locked

try_read and try_write are available for avoiding blocks or in situations that could deadlock

rust match users.try_read(&32) { Some((key, mut shard)) => Ok(shard.get(key)), None => Err(WouldBlock) };

Performance Comparison

These measurements were generated using jonhoo/bustle. To reproduce the charts, see the benchmarks directory. Benchmarks can be misleading. It is recommended to benchmark using a real application workload.

Average Performance by Implementation

This ran each implementation over the presets in bustle::Mix for 5 iterations / random seeds using a Intel® Core™ i9-9820X. Lower numbers are better. Approaches using a single std::sync Lock and chashmap were discarded for clarity (they are a lot slower). If you know why chashmap is so slow in this test, please help here.

Read Heavy Performance) Write Heavy Performance) Update Heavy Performance) Uniform Performance)

Acknowledgements

Many thanks to

License

Licensed under either of Apache License, Version 2.0 or MIT license at your option.

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in sharded by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

License: MIT OR Apache-2.0