#byte #tags #integer #integer-value #codec #64-bit #length

streamvbyte64

支持64位宽值的stream-vbyte编解码器实现

3个不稳定版本

0.2.0 2023年7月26日
0.1.1 2023年7月4日
0.1.0 2023年7月4日

#271 in 压缩

MIT/Apache

125KB
2.5K SLoC

快速字节对齐整数编码

此crate是Daniel Lemire的streamvbyte库的Rust移植。它包含针对不同整数大小和值分布的该格式的多个实现。

每个Coder实现产生不同的格式,彼此不兼容。名称提供每个值4个可能的标签的长度,因此Coder1234将每个条目编码为1、2、3或4个字节。标量实现始终可用,但会自动使用针对目标的加速实现(如果可用)。

性能

所有Coder都提供了标量实现,但通常速度很慢。所有实现还包括在为小端aarch64构建时使用NEON指令集和x86_64使用SSSE3SSE4.1指令集时的加速。

Coder1234通常是最快的,但还有其他标签长度分布可供选择(包括用于64位值的Coder1248)。

在M1 Macbook Air上收集了基准测试数据,以生成自己的运行

cargo bench --bench=streamvbyte

每个基准测试都使用具有多达一定长度的1024个元素,并使用zipf-like分布运行。

encodedecode基准测试测量值编码吞吐量,deltas变体在单调递增输入的情况下测量相同的值,并压缩值之间的增量。 data_len测量基于标签值的确定数据长度的吞吐量,skip_deltas对增量编码流做同样的事情,并包括跳过的所有值的总和。

Coder1234

基准测试 吞吐量
encode/1 4.8Gelem/s
encode_deltas/1 4.1Gelem/s
decode/1 12.7Gelem/s
decode_deltas/1 5.6Gelem/s
skip_deltas/1 19.9Gelem/s
data_len/1 54.2Gelem/s
encode/2 4.8Gelem/s
encode_deltas/2 3.8Gelem/s
decode/2 8.2Gelem/s
decode_deltas/2 4.2Gelem/s
skip_deltas/2 8.5Gelem/s
encode/4 4.8Gelem/s
encode_deltas/4 4.1Gelem/s
decode/4 8.2Gelem/s
decode_deltas/4 4.2Gelem/s
skip_deltas/4 8.4Gelem/s

Coder0124

基准测试 吞吐量
encode/1 4.2Gelem/s
encode_deltas/1 3.6Gelem/s
decode/1 7.2Gelem/s
decode_deltas/1 4.2Gelem/s
skip_deltas/1 7.1Gelem/s
data_len/1 53.8Gelem/s
encode/2 4.2Gelem/s
encode_deltas/2 3.6Gelem/s
decode/2 7.2Gelem/s
decode_deltas/2 4.2Gelem/s
skip_deltas/2 7.3Gelem/s
encode/4 4.2Gelem/s
encode_deltas/4 3.6Gelem/s
decode/4 7.2Gelem/s
decode_deltas/4 4.2Gelem/s
skip_deltas/4 7.5Gelem/s

Coder1248

基准测试 吞吐量
encode/1 3.1Gelem/s
encode_deltas/1 2.5Gelem/s
decode/1 4.6Gelem/s
decode_deltas/1 3.6Gelem/s
skip_deltas/1 6.0Gelem/s
data_len/1 53.8Gelem/s
encode/4 3.1Gelem/s
encode_deltas/4 2.5Gelem/s
decode/4 4.8Gelem/s
decode_deltas/4 3.6Gelem/s
skip_deltas/4 5.7Gelem/s
encode/8 3.0Gelem/s
encode_deltas/8 2.5Gelem/s
decode/8 4.8Gelem/s
decode_deltas/8 3.0Gelem/s
skip_deltas/8 5.4Gelem/s

依赖项

~160KB