3 个不稳定版本
| 0.5.1 | 2024年2月26日 |
|---|---|
| 0.4.1 | 2023年12月25日 |
| 0.4.0 | 2023年12月3日 |
#561 in 编码
每月下载量 149
在 2 个crate中使用(通过 lightyear)
200KB
5K SLoC
Bitcode
与 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)]来编译
与 bincode 和 postcard 的基准比较
原始类型(位大小)
| 类型 | 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 |
更多基准
致谢
一些测试用例来自 bincode(见 tests.rs 中的注释)。
许可证
根据您的要求,受以下任一许可证的约束:
- Apache License,版本 2.0(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证(LICENSE-MIT 或 https://open-source.org.cn/licenses/MIT)
任选其一。
贡献
除非您明确说明,否则任何有意提交给作品作为贡献并由 Apache-2.0 许可证定义的内容,将按上述方式双授权,不附加任何额外条款或条件。
依赖项
~240–490KB