9 个版本
0.1.8 | 2024 年 7 月 27 日 |
---|---|
0.1.7 | 2024 年 7 月 21 日 |
#871 在 数据结构
842 每月下载量
98KB
2K SLoC
COW HashMap
该包采用了从 Google 的高性能 [SwissTable] 哈希表移植过来的原始 hashmap 实现,并用原子指针比较和替换操作封装它,从而赋予它写时复制的语义。
注意:将值插入到 hashmap 中将复制组成 hashmap 的碎片,因此在这里需要考虑性能因素。
这个 hashmap 在插入和读取方面表现良好,因此非常适合读取密集型操作。
HashMap 中叶子的值也采用写时复制,因此只读访问非常快,但写入将复制原始值并执行比较和交换操作。
许多使用 lambda 函数执行写操作的构造已经在比较和交换循环中实现,因此允许并发写操作而不会丢失数据,但是当使用 get_mut
获取值时,当它超出作用域时,值将被完全替换。
内部结构
HashMap 的工作原理如下
- HashMap 使用三层不同大小的层构建,这些层经过优化以最大限度地减少复制的数量。
- 向 hashmap 中插入或删除值时,会复制特定的碎片,然后执行比较和交换操作,以安全地将其替换到主映射中。
- HashMap 中的每个条目在编辑时都会进行克隆。
- 带有 lambda 的突变函数将比较和交换突变值,从而确保并发写操作是安全的。
- 在层的最底层是一个普通的 hashbrown 表,其中包含实际的值。
性能
这不是最好的性能测试,但总比没有好!
向 HashMap 中插入和删除了 100 万条记录。
PS C:\Users\johna\prog\cow_hashmap> cargo test --release test_millions_of_inserts_and_removes
Finished `release` profile [optimized] target(s) in 0.01s
Running unittests src\lib.rs (target\release\deps\cow_hashmap-1df93076c4962117.exe)
running 1 test
test tests::test_millions_of_inserts_and_removes ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 32 filtered out; finished in 3.79s
PS C:\Users\johna\prog\cow_hashmap>
使用方法
将此添加到您的 Cargo.toml
[dependencies]
cow_hashbrown = "0.1"
然后
use cow_hashmap::CowHashMap;
let map = CowHashMap::new();
map.insert(1, "one");
许可证
许可方式为以下之一
- Apache 许可证 2.0 版,(LICENSE-APACHE 或 https://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 https://opensource.org/licenses/MIT)
任选其一。
贡献
除非您明确声明,否则根据 Apache-2.0 许可证定义的任何贡献,都将按照上述方式双重许可,而无需任何附加条款或条件。
依赖关系
约 1.5MB
~19K SLoC