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 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
贡献
除非您明确说明,否则任何有意提交给作品作为贡献并由 Apache-2.0 许可证定义的内容,将按上述方式双授权,不附加任何额外条款或条件。
依赖项
~240–490KB