18 个稳定版本
1.4.2 | 2023 年 10 月 24 日 |
---|---|
1.4.1 | 2022 年 12 月 26 日 |
1.4.0 | 2022 年 7 月 14 日 |
1.3.3 | 2022 年 3 月 11 日 |
1.2.0 | 2020 年 11 月 17 日 |
在 内存管理 中排名第 131
每月下载量 1,397
在 3 crates 中使用
49KB
1.5K SLoC
smallmap
使用单个字节键索引的小型表映射。专为具有微小键的映射设计。
页面存储为 256 个条目的键值数组,通过字节键索引进行索引。键用于碰撞检查,在碰撞时检查下一页或插入所需的项。 smallmap
对于所有不变量都可以表示为唯一字节类型的情况,永远不会需要分配超过 1 页。
用法
API 是与 HashMap
相似的一个子集,包含相同的 insert
、get
和 entry
函数
fn max_char(chars: &str) -> (char, usize)
{
let mut map = Map::new();
for x in chars.chars() {
*map.entry(x).or_insert(0usize) += 1;
}
map.into_iter().max_by_key(|&(_, v)| v).unwrap_or_default()
}
用例
适用于您想要具有相对简单键的小型映射的实例(例如,原始类型)。在这些情况下,性能可以比基于哈希的映射快一个数量级或更多。
可能使用的情况
- 您有小型键
- 您的映射不存在拒绝服务攻击的风险。
- 当作为
u8
表示时,您的键不太可能有很多碰撞。
不使用的情况
- 您有复杂键
- 拒绝服务是一个担忧
- 您的映射将包含大量条目
- 当作为
u8
表示时,您的键可能有大量碰撞。
基准测试
一些粗略和基本的基准测试
char
哪个 | ns/iter |
---|---|
HashMap |
16 |
smallmap::Map |
7 |
迭代字符串的字符并计数
哪个 | ns/iter (entry) | ns/iter (get/insert) |
---|---|---|
HashMap |
8,418 | 8,367 |
BTreeMap |
9,742 | 6,329 |
smallmap::Map |
4,416 | 1,739 |
u8
哪个 | ns/iter |
---|---|
HashMap |
15 |
smallmap::Map |
2 |
许可证
MIT 许可证
依赖关系
~185KB