9 个版本
0.2.1 | 2022年7月14日 |
---|---|
0.2.0 | 2022年7月14日 |
0.1.0 | 2021年8月27日 |
0.0.6 | 2020年10月22日 |
0.0.5 | 2020年8月20日 |
#775 在 数据结构
在 scherben-map 中使用
29KB
467 行
注意:此包仍在早期开发阶段,API 正在变化。 欢迎贡献、特性请求和建设性反馈。
sharded ─
Sharded 在 Rust 中提供了安全、快速且直观的并发集合。此包将底层集合分为 N shards
,每个 shard 都有自己的锁。调用 read(&key)
或 write(&key)
返回单个 shard 的 guard。有关策略的进一步阅读,请参阅 关于 C++ 的 parallel-hashmap
的文章。
特性
-
零不安全代码。 此库使用
#![forbid)
并由许多替代方案中存在的复杂性和内存错误数量所驱动。 -
体积小巧。 核心逻辑大约有 100 行代码。随着实用工具和用户体验的添加,这可能会随着时间的推移而增加。默认情况下,该库仅使用
std
和hashbrown
。如果您想引入一些社区包,如parking_lot
、ahash
等,只需添加相应的功能即可。 -
非常快速。 此实现可能比一些最受欢迎的并发哈希表更高效。请在您的负载上尝试它,并告诉我们您的结果。
另请参阅
- countrie - 并发哈希 trie 映射和集合。
- dashmap - Rust的闪电般快速并发HashMap。
- flurry - Java的
java.util.concurrent.ConcurrentHashMap
到Rust的移植。(也是一系列现场直播的一部分)
快速开始
[dependencies]
# Optionally use `parking_lot`, `ahash`, `fxhash`, `seahash`, and `xxhash`
# by specifing the feature by the same name e.g.
sharded = { version = "0.2", features = ["fxhash", "parking_lot"] }
示例
插入键值对
let users = Map::new();
users.insert(32, "Henry");
访问存储分片
Map
提供了read
和write
,它们提供了对底层存储(使用hashbrown::raw
构建)的访问。这两种方法都返回一个元组,形式为(Key, Guard<Shard>)
let (key, shard) = users.read(&32);
assert_eq!(shard.get(key), Some(&"Henry"));
确定存储分片是否已锁定
try_read
和try_write
可用于避免阻塞或在可能产生死锁的情况中
match users.try_read(&32) {
Some((key, mut shard)) => Ok(shard.get(key)),
None => Err(WouldBlock)
};
性能比较
这些测量值是使用jonhoo/bustle
生成的。要重现图表,请参阅benchmarks
目录。基准测试可能会产生误导。建议使用真实应用程序的工作负载进行基准测试。
平均性能按实现方式
使用Intel® Core™ i9-9820X在bustle::Mix
预设上进行5次迭代/随机种子运行每个实现。数字越低越好。为了清晰起见,排除了使用单个std::sync
锁和chashmap
的方法(它们要慢得多)。如果您知道为什么在这次测试中chashmap
如此慢,请在此处提供帮助。
致谢
非常感谢
-
Reddit社区提供的一些提示和继续这个项目的动力。
-
Jon Gjengset提供的现场直播和实用crate
-
以及无数使这项工作成为可能的开源贡献者
许可
根据您的选择,在Apache License, Version 2.0或MIT license下许可。
除非您明确说明,否则您根据Apache-2.0许可定义的任何有意提交以包含在sharded
中的贡献,都将如上所述双重许可,不附加任何额外条款或条件。
许可:MIT OR Apache-2.0
依赖项
~0.8–1.3MB
~17K SLoC