#hash-map #simd-accelerated #simd #map #small-vec #heap-allocation

small-map

一个专为少量数据设计的内联SIMD加速哈希表

3个版本

0.1.3 2024年1月17日
0.1.2 2024年1月17日
0.1.1 2023年11月2日
0.1.0 2023年11月2日

#193 in 数据结构

Download history 4147/week @ 2024-04-20 3166/week @ 2024-04-27 3038/week @ 2024-05-04 3067/week @ 2024-05-11 2507/week @ 2024-05-18 2084/week @ 2024-05-25 3068/week @ 2024-06-01 2416/week @ 2024-06-08 3254/week @ 2024-06-15 1735/week @ 2024-06-22 2048/week @ 2024-06-29 4224/week @ 2024-07-06 4692/week @ 2024-07-13 4312/week @ 2024-07-20 2914/week @ 2024-07-27 2534/week @ 2024-08-03

15,196 每月下载量
用于 9 个crate(5个直接使用)

MIT/Apache

115KB
1.5K SLoC

Small-Map

Crates.io

一个专为少量数据设计的内联SIMD加速哈希表。

用法

use small_map::SmallMap;
// Don't worry about the 16 here.
// When the size grows, it will automatically switch to heap impl.
type MySmallMap<K, V> = SmallMap<16, K, V>;

let mut map = MySmallMap::new();
map.insert(1_u8, 2_u8);
assert_eq!(*map.get(&1).unwrap(), 2);

通常您可以用这个映射表处理生命周期短和键值较小的数据,例如http或RPC头部。

您可以用它像其他普通哈希表一样使用,无需担心其大小。

性能

SmallMap的性能取决于容量、键/值大小和操作场景。

建议设置为16(或32),因为SSE2可以在一条指令内搜索16个条目。仅推荐用于小型键值,如数字和字符串。

benchmark result

以下是一个大小为16,键/值为u8的基准结果。这个基准测试是在Intel Xeon上进行的。

[!注意] 在测试场景中,与HashBrown相比,可以节省25%~43%的CPU;与std HashMap相比,可以节省25%~54%的CPU。

工作原理

与SmallVec类似,对于少量数据的HashMap,内联数据可以避免堆分配开销并提高性能。

SmallMap内联了一个固定大小的顺序结构,并参考了swisstable的设计,在组单元中存储数据的哈希值,并使用SIMD来加速搜索。

当数据容量超过内联容量时,数据将转移到由hashbrown实现的HashMap中。

致谢

Hashbrown 项目大量参考并复制了此项目,是一个非常优雅和高效的实现。

依赖关系

~0.7–1.2MB
~17K SLoC