#serialization #bitcode #bit-manipulation #codec #enums #binary #variant

bitcode_lightyear_patch

bitcode 是一个位运算二进制序列化器

3 个不稳定版本

0.5.1 2024年2月26日
0.4.1 2023年12月25日
0.4.0 2023年12月3日

#561 in 编码

Download history 10/week @ 2024-03-11 15/week @ 2024-03-18 9/week @ 2024-03-25 94/week @ 2024-04-01 9/week @ 2024-04-08 38/week @ 2024-04-15 14/week @ 2024-04-22 80/week @ 2024-04-29 35/week @ 2024-05-06 28/week @ 2024-05-13 45/week @ 2024-05-20 23/week @ 2024-05-27 36/week @ 2024-06-03 29/week @ 2024-06-10 34/week @ 2024-06-17 48/week @ 2024-06-24

每月下载量 149
2 个crate中使用(通过 lightyear

MIT/Apache

200KB
5K SLoC

Bitcode

Documentation crates.io Build unsafe forbidden

bincode 类似的位编码/解码器,它试图在不牺牲速度的情况下缩小序列化大小(就像压缩一样)。

该格式可能在主要版本之间更改,因此我们可以自由地优化它。

bincode 的比较

功能

  • 位运算序列化
  • Gamma 编码长度和枚举变体索引

通过 #[derive(bitcode::Encode, bitcode::Decode)] 添加额外功能

  • 枚举使用尽可能少的位,例如,具有4个变体的枚举使用2位
  • 将属性应用于字段/枚举变体
属性 类型 结果
#[bitcode_hint(ascii)] 字符串 每个字符使用7位
#[bitcode_hint(ascii_lowercase)] 字符串 每个字符使用5位
#[bitcode_hint(expected_range= "50..100"] u8-u64 使用 log2(range.end - range.start) 位
#[bitcode_hint(expected_range= "0.0..1.0"] f32/f64 使用 ~25 位用于 f32 和 ~54 位用于 f64
#[bitcode_hint(frequency= 123) 枚举变体 频繁变体使用更少的位(参见 Huffman 编码
#[bitcode_hint(gamma)] i8-i64/u8-u64 小整数使用更少的位(参见 Elias gamma 编码
#[bitcode(with_serde)] T: Serialize 使用 serde::Serialize 而不是 bitcode::Encode

限制

  • 不支持流式API
  • 主要版本之间可能更改格式
  • 使用 feature = "derive",包含自身的类型必须使用 #[bitcode(recursive)] 来编译

bincodepostcard 的基准比较

原始类型(位大小)

类型 Bitcode(derive) Bitcode(serde) Bincode Bincode(varint) Postcard
bool 1 1 8 8 8
u8/i8 8 8 8 8 8
u16/i16 16 16 16 8-24 8-24
u32/i32 32 32 32 8-40 8-40
u64/i64 64 64 64 8-72 8-80
u128/i128 128 128 128 8-136 8-152
usize/isize 64 64 64 8-72 8-80
f32 32 32 32 32 32
f64 64 64 64 64 64
char 21 21 8-32 8-32 16-40
Option<()> 1 1 8 8 8
Result<(), ()> 1 1-3 32 8 8
enum { A, B, C, D } 2 1-5 32 8 8
Duration 94 96 96 16-112 16-120

注意:这些是默认值,在 Bitcode(derive)或 serde 序列化器的情况下,可以通过提示进行优化。

值(位大小)

Bitcode(derive) Bitcode(serde) Bincode Bincode(varint) Postcard
[true; 4] 4 4 32 32 32
vec![(); 0] 1 1 64 8 8
vec![(); 1] 3 3 64 8 8
vec![(); 256] 17 17 64 24 16
vec![(); 65536] 33 33 64 40 24
"" 1 1 64 8 8
"abcd" 37 37 96 40 40
"abcd1234" 71 71 128 72 72

随机 结构体和枚举(平均大小和速度)

格式 大小(字节) 序列化(纳秒) 反序列化(纳秒)
Bitcode(derive) 6.2 14 50
Bitcode(serde) 6.7 18 59
Bincode 20.3 17 61
Bincode(varint) 10.9 26 68
Bincode(LZ4) 9.9 58 73
Bincode(Deflate Fast) 8.4 336 279
Bincode(Deflate Best) 7.8 1990 275
Postcard 10.7 21 57

更多基准

rust_serialization_benchmark

致谢

一些测试用例来自 bincode(见 tests.rs 中的注释)。

许可证

根据您的要求,受以下任一许可证的约束:

任选其一。

贡献

除非您明确说明,否则任何有意提交给作品作为贡献并由 Apache-2.0 许可证定义的内容,将按上述方式双授权,不附加任何额外条款或条件。

依赖项

~240–490KB