3个不稳定版本
使用旧的Rust 2015
0.2.0-beta | 2017年7月29日 |
---|---|
0.1.1 | 2017年7月17日 |
0.1.0 | 2017年7月16日 |
#2449 in 数据结构
7KB
151 行
静态Map
这是一个静态循环冗余校验哈希表实现,使用与rustc中相同的哈希器。目前这是使用仅适用于nightly的bang变体的过程宏编写的。过程宏目前处于积极开发中,因此目前我不期望这里有任何稳定性。这只是一个为了获得过程宏开发的体验而进行的练习。
示例
#[macro_use]
extern crate static_map;
#[macro_use]
extern crate static_map_macros;
use static_map::Map;
#[derive(Clone, Copy)]
struct RGB(u8, u8, u8);
static CSS_COLORS: Map<&'static str, RGB> = static_map! {
Default: RGB(0x00,0x00,0x00),
"black" => RGB(0x00,0x00,0x00),
"silver" => RGB(0xc0,0xc0,0xc0),
"gray" => RGB(0x80,0x80,0x80),
"white" => RGB(0xff,0xff,0xff),
"maroon" => RGB(0x80,0x00,0x00),
"red" => RGB(0xff,0x00,0x00),
"purple" => RGB(0x80,0x00,0x80),
"fuchsia" => RGB(0xff,0x00,0xff),
"green" => RGB(0x00,0x80,0x00),
};
pub fn rgb_from_str(color: &str) -> Option<RGB> {
CSS_COLORS.get(color).cloned()
}
注意Default: RGB(0, 0, 0),
。这是必需的,因为我们正在初始化一个将包含空槽的数组。我们需要为这些槽位指定一个默认值,你这样声明它。PHF映射不需要这个,因为它们是完美的。此外,请注意,#[macro_use]
对于两者 static_map
和 static_map_macros
都是必需的。这是因为不允许proc_macros
导出项,所以static_map!
宏位于static_map
包中。(注意:这并不完全正确,并且可能会很快得到修复)。
基准测试
想法是静态循环冗余校验哈希表可能比PHF对某些数据集更有效。权衡是PHF哈希表实现几乎在内存效率方面是最佳的;在最坏的情况下,static_map!
可能使用多达2倍的内存。请记住这一点,以下是一些基准测试(位于static_map_macro/benches
)。
CSS颜色
这包含大约150个&str -> RGB(u8, u8, u8)
条目(如上例所示)。
test bench_phf ... bench: 2,027 ns/iter (+/- 224)
test bench_static_map ... bench: 935 ns/iter (+/- 90)
码点
这个基准测试包含大约4500个u32 -> GlyphMetrics
条目。
test bench_phf ... bench: 44,502 ns/iter (+/- 3,971)
test bench_static_map ... bench: 13,097 ns/iter (+/- 2,768)
TeX 符号
本基准包含约 1500 条 &str -> 符号
条目,将 TeX 符号映射到码点。
test bench_phf ... bench: 20,382 ns/iter (+/- 133)
test bench_static_map ... bench: 24,589 ns/iter (+/- 188)
依赖项
约 130KB