#integer #coding #read-write #io-write

prefix_uvarint

基于前缀的变长整数编码

9个版本 (5个破坏性更新)

0.6.1 2023年3月30日
0.6.0 2023年3月13日
0.5.1 2023年2月25日
0.4.1 2023年2月15日
0.1.0 2022年11月1日

#357 in 压缩

MIT/Apache

39KB
826

prefix_uvarint

Crates.io

此模块实现了一种基于前缀的变长整数编码方案。

与LEB128风格的编码方案不同,此编码在值的第一个字节中使用一元前缀码来指示需要读取多少个后续字节,然后是剩余字节的大端编码。这通过减少编码长值时评估的分支数量来提高编码速度,并允许这些分支不同以提高分支误预测。

PrefixVarInt特质为u64u32u16i64i32i16实现,接近零的值产生较小的输出。使用Zigzag编码来写入有符号值,以确保小的负数产生小的输出。

PrefixVarInt包括将值直接编码到/从字节切片的方法,但还提供了扩展bytes::{Buf,BufMut}和在这些特质中处理这些值的特质。

性能

要了解此代码在您的宿主机上的速度,请运行 cargo bench

使用两种值分布运行基准测试:均匀分布和Zipf分布。在M1 MacBookAir上,编码速度平均为1.2G elem/s,对于编码为单个字节的值,下降到约400M elem/s。值的编码长度(PrefixVarInt::prefix_varint_len())平均为3G+ elem/s。

依赖项

~170KB