3 个版本
0.1.3 | 2020年8月23日 |
---|---|
0.1.2 | 2020年8月23日 |
0.1.1 | 2020年8月23日 |
0.1.0 |
|
#2290 in 编码
33KB
596 行
Bin Text
使用 SIMD 编码和解码二进制编码的文本为对齐的二进制数据块
支持 SIMD(AVX2 和 SSSE3)的快速二进制文本编码和解码,具有良好的回退性能。
这个 crate 的主要思想是提供文本格式的零拷贝二进制反序列化。
工作原理
文本格式无法保证对齐,因此无论数据如何,在解码时都需要重新对齐,如果所需的对齐是 N
,则最大偏移量需要移动的字节数小于 N
。因此,通过在二进制编码的文本中提供 N - 1
的起始填充,可以实现对齐到 N
。
快速说明 此 crate 只接受等于或大于 N
的填充,因为这做起来比较便宜。
// Padding of 8 (suppose it was read form a file)
let hex = "--------a1f7d5e8d14f0f76".to_string();
unsafe {
// Decode with padding of 8 and alignment of 8
let slice = bintext::hex::decode_aligned(&mut hex, 8, 8).unwrap();
// Data is aligned so you can safely do this:
let slice: &[u64] = std::slice::from_raw_parts(
slice.as_ptr() as *const _,
slice.len() / std::mem::size_of::<u64>()
);
}
待办事项
- NEON 指令集
- Base64
其他类似 crate
有许多其他 crate 已经完成了这项工作,但每个都存在某种性能上的不足。
hex
性能较差,但代码体积较小,因为它不依赖于查找表(LUTs);base16
,没有 SIMD,但解码更快,整体编码性能良好;faster-hex
使用 SSSE3 和 AVX2 进行快速编码,解码只使用 AVX2。SSE 是所有指令集中 SIMD 覆盖面最好的,因此应该是一个必须的选项。
此 crate 提供了覆盖所有竞争对手性能弱点的实现。只需运行 cargo bench
。
所有这些 crate 都没有提供解码对齐数据的函数,因此在解码后需要额外的对齐步骤。