15个版本
0.0.15 | 2024年1月1日 |
---|---|
0.0.14 | 2023年5月9日 |
0.0.12 | 2023年4月27日 |
在内存管理中排名第69
每月下载量达72次
87KB
1.5K SLoC
HashMap的一个非常快速的替代品,适用于非常小的映射。它也比FxHashMap、hashbrown、ArrayMap、IndexMap以及其他所有映射都快。映射越小,性能越高。观察发现,当映射包含的键数超过20个时,可能更适合使用标准的HashMap,因为micromap::Map的性能可能会开始下降。请参见下面的基准测试结果。
欢迎:并非所有在映射中可能期望拥有的功能都已实现。如果您能通过实现这些缺失的功能来做出贡献,我将不胜感激。
首先,将以下内容添加到Cargo.toml
[dependencies]
micromap = "0.0.14"
然后,像使用标准哈希映射一样使用它...嗯,几乎是这样
use micromap::Map;
let mut m : Map<u64, &str, 10> = Map::new(); // allocation on stack
m.insert(1, "foo");
m.insert(2, "bar");
assert_eq!(2, m.len());
请注意,这里创建的映射带有额外的泛型参数10
。这是映射的总大小,当调用::new()
时在栈上分配。与HashMap不同,Map完全不使用堆。如果向映射中添加超过十个键,它将引发panic。
阅读 API 文档。结构体 micromap::Map
被设计得尽可能类似于 std::collections::HashMap
。
基准测试
以下是一个简单基准测试的总结,我们比较了 micromap::Map
与其他几个 Rust 映射,改变了映射的总容量(水平轴)。我们对它们应用了相同的交互(benchmark.rs
),并测量了它们的性能。在下表中,大于 1.0 的数字表示性能提升,而小于 1.0 的数字表示性能下降。
2 | 4 | 8 | 16 | 32 | 64 | 128 | |
---|---|---|---|---|---|---|---|
hashbrown::HashMap |
21.49 | 11.70 | 6.48 | 3.64 | 1.66 | 0.60 | 0.31 |
heapless::LinearMap |
1.00 | 1.59 | 1.18 | 1.27 | 1.34 | 1.20 | 0.98 |
indexmap::IndexMap |
12.81 | 12.48 | 7.53 | 4.62 | 2.41 | 0.97 | 0.49 |
linear_map::LinearMap |
2.27 | 1.62 | 1.16 | 1.09 | 1.04 | 1.15 | 1.15 |
linked_hash_map::LinkedHashMap |
28.55 | 21.61 | 12.49 | 7.42 | 3.83 | 1.57 | 0.78 |
litemap::LiteMap |
3.76 | 2.89 | 2.04 | 1.86 | 1.32 | 0.59 | 0.48 |
micromap::Map 👍 |
1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 |
nohash_hasher::BuildNoHashHasher |
21.08 | 12.04 | 7.62 | 3.31 | 1.65 | 0.64 | 0.34 |
rustc_hash::FxHashMap |
20.51 | 11.79 | 6.66 | 3.94 | 1.44 | 0.55 | 0.30 |
std::collections::BTreeMap |
21.16 | 10.37 | 8.66 | 6.60 | 3.83 | 1.20 | 0.73 |
std::collections::HashMap |
22.02 | 14.87 | 8.98 | 5.29 | 2.84 | 1.05 | 0.58 |
tinymap::array_map::ArrayMap |
2.00 | 4.71 | 4.56 | 4.90 | 5.58 | 4.57 | 4.70 |
该实验于 2023-12-31 进行。重复周期为 1000000。整个基准测试耗时 194 秒。
如您所见,对于小于十个键的映射,性能提升最为显著。对于只有几个键的映射,提升非常巨大。
如何贡献
首先安装 Rust,然后
$ cargo test -vv
如果一切顺利,Fork 存储库,进行更改,通过发送给我们 pull request。我们会审查您的更改,并在不久后将其应用到 master
分支,前提是它们不违反我们的质量标准。为了避免失望,在发送 pull request 之前,请再次运行 cargo test
。此外,运行 cargo fmt
和 cargo clippy
。
此外,在您开始进行更改之前,运行基准测试
$ rustup run nightly cargo bench
然后,在您进行更改后再次运行。比较结果。如果您的更改降低了性能,在提交 pull request 之前请三思。
依赖项
~170KB