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 中使用

MIT/Apache

29KB
467

注意:此包仍在早期开发阶段,API 正在变化。 欢迎贡献、特性请求和建设性反馈。

sharded ─ 构建 包

Sharded 在 Rust 中提供了安全、快速且直观的并发集合。此包将底层集合分为 N shards,每个 shard 都有自己的锁。调用 read(&key)write(&key) 返回单个 shard 的 guard。有关策略的进一步阅读,请参阅 关于 C++ 的 parallel-hashmap 的文章。

特性

  • 零不安全代码。 此库使用 #![forbid) 并由许多替代方案中存在的复杂性和内存错误数量所驱动。

  • 体积小巧。 核心逻辑大约有 100 行代码。随着实用工具和用户体验的添加,这可能会随着时间的推移而增加。默认情况下,该库仅使用 stdhashbrown。如果您想引入一些社区包,如 parking_lotahash 等,只需添加相应的功能即可。

  • 非常快速。 此实现可能比一些最受欢迎的并发哈希表更高效。请在您的负载上尝试它,并告诉我们您的结果。

另请参阅

  • 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提供了readwrite,它们提供了对底层存储(使用hashbrown::raw构建)的访问。这两种方法都返回一个元组,形式为(Key, Guard<Shard>)

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

确定存储分片是否已锁定

try_readtry_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如此慢,请在此处提供帮助。

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

致谢

非常感谢

  • Reddit社区提供的一些提示和继续这个项目的动力。

  • Jon Gjengset提供的现场直播和实用crate

  • 以及无数使这项工作成为可能的开源贡献者

许可

根据您的选择,在Apache License, Version 2.0MIT license下许可。

除非您明确说明,否则您根据Apache-2.0许可定义的任何有意提交以包含在sharded中的贡献,都将如上所述双重许可,不附加任何额外条款或条件。

许可:MIT OR Apache-2.0

依赖项

~0.8–1.3MB
~17K SLoC