#ascii #byte #set #search #performance

无 std bset

快速且紧凑的字节或 ASCII 字符集合

1 个不稳定版本

0.1.0 2021 年 3 月 13 日

#2023Rust 模式

MIT 许可证

19KB
245

bset

Crates.io status Docs

快速且紧凑的字节和 ASCII 字符集合,用于搜索、解析和确定给定字节是否属于给定集合。它们不使用任何分配,甚至不使用任何 std 功能。实际上,所有提供的函数都是 const,因此可以在编译时自由构建

集合

该包导出两种集合类型 - ByteSet 用于通用字节集合和 AsciiSet 用于限制在 ASCII 字符范围内的集合。在内存中占用小两倍,但需要在性能上做出轻微的权衡,以检查给定的字符是否属于 ASCII 范围。

use ascii_set::AsciiSet;

const OP: AsciiSet = AsciiSet::new().add_bytes(b"+-*/%&|^");
assert!(OP.contains(b'%'));

集合以指针大小的位掩码数组实现。

集合栈

受 Maciej Hirsz 的文章 的启发,此包提供了一种将多个集合堆叠到单个结构中以获得更高性能的方法。为了不降低速度,集合在类型级别上“获取”。为此,模块 bits 包含类型 B0B1、...、B7,表示堆栈中集合的索引。由于目前不支持泛型函数的 const fn,集合通过它们添加到堆栈的顺序进行索引。可以使用类型别名来识别堆栈中的集合

	use ascii_set::{bits::*, ByteSet, ByteStack};

const BYTE_STACK: ByteStack<B3> = ByteStack::new()
    .add_set(ByteSet::DIGITS)
    .add_set(ByteSet::ALPHABETIC)
    .add_set(ByteSet::new().add_bytes(b"+-*/%&|^"));
type Digits = B0;
type Alphabetic = B1;
type Operations = B2;
assert!(BYTE_STACK.contains::<Operations>(b'%'));

同样,有两种版本,ByteStack 用于所有字节和限制在 ASCII 范围内的 AsciiStack。基准测试显示,使用堆叠集合进行集合成员资格检查快约 20%。它们的内存大小增加了 8 倍(128/256 字节与 16/32 字节相比),并且不会随着添加堆栈而增加,因此当在一个堆栈中使用 8 个集合(最大数量)时,内存大小是等效的。

基准测试

堆叠的全字节集合版本在性能上始终优于 matchstdis_ascii_* 函数。对于某些简单集合,集合版本可能稍微慢一些。

字母数字字符

test alnum_ascii_set        ... bench:       1,051 ns/iter (+/- 48) = 974 MB/s
test alnum_ascii_stack      ... bench:         801 ns/iter (+/- 33) = 1278 MB/s
test alnum_byte_set         ... bench:         839 ns/iter (+/- 50) = 1220 MB/s
test alnum_byte_stack       ... bench:         620 ns/iter (+/- 33) = 1651 MB/s
test alnum_is_alnum         ... bench:       1,574 ns/iter (+/- 70) = 650 MB/s
test alnum_match            ... bench:       1,573 ns/iter (+/- 86) = 650 MB/s

字母字符

test letter_ascii_set       ... bench:       1,027 ns/iter (+/- 42) = 997 MB/s
test letter_ascii_stack     ... bench:         943 ns/iter (+/- 45) = 1085 MB/s
test letter_byte_set        ... bench:         839 ns/iter (+/- 34) = 1220 MB/s
test letter_byte_stack      ... bench:         619 ns/iter (+/- 29) = 1654 MB/s
test letter_is_alphabetic   ... bench:         820 ns/iter (+/- 42) = 1248 MB/s
test letter_match           ... bench:         825 ns/iter (+/- 36) = 1241 MB/s

小写字母

test lowercase_ascii_set    ... bench:       1,197 ns/iter (+/- 52) = 855 MB/s
test lowercase_ascii_stack  ... bench:         893 ns/iter (+/- 45) = 1146 MB/s
test lowercase_byte_set     ... bench:         890 ns/iter (+/- 44) = 1150 MB/s
test lowercase_byte_stack   ... bench:         451 ns/iter (+/- 14) = 2270 MB/s
test lowercase_is_lowercase ... bench:         752 ns/iter (+/- 33) = 1361 MB/s
test lowercase_match        ... bench:         771 ns/iter (+/- 67) = 1328 MB/s

URI保留字符(根据RFC 3986第2.2节)

test uri_ascii_set          ... bench:       1,243 ns/iter (+/- 87) = 823 MB/s
test uri_ascii_stack        ... bench:         887 ns/iter (+/- 103) = 1154 MB/s
test uri_byte_set           ... bench:         905 ns/iter (+/- 84) = 1131 MB/s
test uri_byte_stack         ... bench:         610 ns/iter (+/- 35) = 1678 MB/s
test uri_match              ... bench:       1,294 ns/iter (+/- 45) = 791 MB/s

许可证:MIT

无运行时依赖