3 个版本
0.1.2 | 2023年10月16日 |
---|---|
0.1.1 | 2023年10月15日 |
0.1.0 | 2023年10月15日 |
963 在 编码 中
每月 87 次下载
在 5 crates 中使用
49KB
747 行
🚀 Base 64
✨ Rust 的 SIMD 加速 Base64 ✨
🌟 特点
- 💡 使用 AVX2 指令实现超快编码和解码
- 🔄 当 AVX2 不可用时,使用任何可用的 SIMD 作为回退
🎯 项目目标
- 🔧 简单、惯用的 API
- 📦 合理的默认值
- ⚡ 快速
安装
cargo add bs64
使用方法
use bs64;
fn main() {
// Encode
let input = vec![2, 3, 4, 5];
let output: String = bs64::encode(&input);
// Decode
let decoded_output = bs64::decode(output.as_bytes());
}
基准测试
在 Intel® Core™ i7-1065G7 上使用 100k 输入,10000 次迭代运行。与 base64 和 data-encoding crate 进行比较。
cargo run --features "cli" --release -- -b 100000 -i 10000
编码
名称 | MB/s |
---|---|
🚀 bs64::encode() | 4813.70 |
🚀 bs64::encode_mut() | 6579.17 |
🚀 bs64 回退 | 944.18 |
data_encoding | 858.51 |
data_encoding mut | 873.28 |
base64 | 748.02 |
base64 mut | 870.99 |
解码
名称 | MB/s |
---|---|
🚀 bs64::decode() | 3899.26 |
🚀 bs64::decode_mut() | 3965.25 |
🚀 bs64 回退 | 837.17 |
data_encoding | 647.33 |
data_encoding mut | 684.01 |
base64 | 761.68 |
base64 mut | 805.60 |
实现细节
代码最初是从 https://github.com/lemire/fastbase64 转移过来的
简单回退实现基于 fastbase64 仓库中的 chromium
实现。Rust 实现中使用迭代器和将输入分块,使得编译器能够轻松地向量化处理。
与原始的 fastbase64
实现相比,AVX2 实现几乎没有变化。
代码针对 x86_64 进行了优化,因此假定存在足够大的缓存来存储查找表。我创建了一个简单的实现,它索引了一个静态有效 Base64 字符数组 - 其性能仅略低于铬 LUT 实现,因此我可能将其添加为低内存目标的选项(例如嵌入式)。
有用的链接
- https://github.com/lemire/fastbase64
- https://www.nickwilcox.com/blog/autovec/
- https://en.wikipedia.org/wiki/Base64
TODO
- 集成测试
- 基准测试套件
- 符合 MIME、UTF-7 和其他 Base64 标准
- 回归测试 + Github Actions 中的基准测试
- 使用功能标志更改默认实现
- 在运行时创建自定义配置的构建器
依赖关系
~0.3–1MB
~22K SLoC