16 个稳定版本
2.0.3 | 2022 年 11 月 28 日 |
---|---|
2.0.2 | 2022 年 11 月 26 日 |
1.5.0 | 2022 年 11 月 25 日 |
在 编码 中排名 1183
每月下载量 1,073
在 2 crates 中使用
62KB
378 行
rbase64
rbase64 是一个快速的多线程 base64 编码/解码库和 CLI 工具,由 Rust 编写。
你是否曾经想要对数十吉字节的数据进行 base64 编码,但觉得你的编码器不够快?我也一样。无论如何,rbase64 都能够胜任这项任务。
rbase64 的目标是提供一个快速的 base64 编码实现。该库经过彻底测试和优化,以实现高吞吐量。截至 v2.0.3,rbase64 能够达到高达 11.133 GiB/s 的编码和 14.251 GiB/s 的解码速率(在 MacBook Air M1 2020 笔记本电脑上,10~20 MiB 批次进行测量)。
该项目还包括一个由库编码器提供的命令行界面。虽然受 I/O 限制,但与其它替代方案相比,它仍然实现了很高的性能(例如,GNU base64 的 11 倍)。
有关详细信息,请参阅 性能。
用法
库
将 rbase64 添加到你的 Cargo.toml 依赖项
[dependencies]
rbase64 = "2.0.3"
示例用法
use rbase64;
fn main() {
let a = b"Hello world";
let b = "SGVsbG8gd29ybGQ=";
assert_eq!(rbase64::encode(a), b);
assert_eq!(&rbase64::decode(b).unwrap(), a);
}
CLI
安装
$ cargo install rbase64 --features cli
用法: rbase64 [选项]
选项 | 描述 |
---|---|
-d, --decode | 解码输入(默认:false) |
-i, --input <INPUT> | 输入文件(如果没有指定,则为 stdin) |
-o, --output <OUTPUT> | 输出文件(如果没有指定,则为 stdout) |
-h, --help | 打印帮助信息 |
-V, --version | 打印版本信息 |
Rbase64 CLI 设计具有与经典 GNU base64 相同的 API,然而,它不会向文件或 stdout 输出添加换行符。
基本用法
$ echo -n "Hello world" | rbase64
SGVsbG8gd29ybGQ=
$ echo -n "SGVsbG8gd29ybGQ=" | rbase64 --decode
Hello world
性能
库
性能是通过 Criterion 的基准测试来衡量的。每个基准测试都测量不同字节大小的输入下的编码/解码速度和吞吐量。以下结果是在 MacBook Air M1 2020 笔记本电脑上运行基准测试时获得的。结果与 cargo.io 上排名前三的最广泛使用的 Rust base64 编码库进行了比较。
编码
基准测试(类型 / 字节数) | rbase64 (v2.0.3) | base64 (v0.20.0) | data-encoding (v2.3.2) | rustc-serialize (v0.3.24) |
---|---|---|---|---|
encode/3 | 186.21 MiB/s | 77.240 MiB/s | 77.208 MiB/s | 91.615 MiB/s |
encode/50 | 1.3780 GiB/s | 904.74 MiB/s | 882.87 MiB/s | 806.29 MiB/s |
encode/100 | 1.7103 GiB/s | 1.2844 GiB/s | 1.3009 GiB/s | 1.0334 GiB/s |
encode/500 | 2.5775 GiB/s | 1.8897 GiB/s | 1.9288 GiB/s | 1.2626 GiB/s |
编码/3072 | 2.7913 GiB/s | 2.3780 GiB/s | 2.4211 GiB/s | 1.4501 GiB/s |
编码/51200 | 2.8454 GiB/s | 2.4486 GiB/s | 2.4678 GiB/s | 1.4765 GiB/s |
编码/102400 | 2.8644 GiB/s | 2.4247 GiB/s | 2.4756 GiB/s | 1.4799 GiB/s |
编码/512000 | 6.1009 GiB/s | 2.5105 GiB/s | 2.5174 GiB/s | 1.4623 GiB/s |
编码/1048576 | 8.0095 GiB/s | 2.5115 GiB/s | 2.5182 GiB/s | 1.4506 GiB/s |
编码/5242880 | 10.042 GiB/s | 2.1806 GiB/s | 2.2009 GiB/s | 1.3416 GiB/s |
编码/10485760 | 11.133 GiB/s | 2.0549 GiB/s | 2.1037 GiB/s | 1.3438 GiB/s |
编码/20971520 | 10.804 GiB/s | 2.0814 GiB/s | 2.0638 GiB/s | 1.3138 GiB/s |
解码
基准测试(类型 / 字节数) | rbase64 (v2.0.3) | base64 (v0.20.0) | data-encoding (v2.3.2) | rustc-serialize (v0.3.24) |
---|---|---|---|---|
解码/3 | 235.57 MiB/s | 52.127 MiB/s | 55.164 MiB/s | 96.523 MiB/s |
解码/50 | 1.9261 GiB/s | 540.87 MiB/s | 728.58 MiB/s | 550.51 MiB/s |
解码/100 | 2.5807 GiB/s | 942.93 MiB/s | 1.1012 GiB/s | 579.12 MiB/s |
解码/500 | 3.3135 GiB/s | 1.8286 GiB/s | 1.7942 GiB/s | 563.76 MiB/s |
解码/3072 | 3.4941 GiB/s | 2.9708 GiB/s | 2.2418 GiB/s | 609.78 MiB/s |
解码/51200 | 3.7189 GiB/s | 3.0924 GiB/s | 2.3634 GiB/s | 618.20 MiB/s |
解码/102400 | 3.7623 GiB/s | 3.0878 GiB/s | 2.4015 GiB/s | 618.18 MiB/s |
解码/512000 | 7.0065 GiB/s | 3.1235 GiB/s | 2.4229 GiB/s | 618.47 MiB/s |
解码/1048576 | 9.3497 GiB/s | 3.1195 GiB/s | 2.4073 GiB/s | 617.00 MiB/s |
解码/5242880 | 12.148 GiB/s | 2.8267 GiB/s | 2.2475 GiB/s | 600.88 MiB/s |
解码/10485760 | 13.424 GiB/s | 2.7416 GiB/s | 2.2384 GiB/s | 599.09 MiB/s |
解码/20971520 | 14.251 GiB/s | 2.6512 GiB/s | 2.1692 GiB/s | 596.77 MiB/s |
CLI
使用随机二进制文件的手动基准测试。与经典的GNU base64和race64(C)进行比较。
测试1GiB随机字节
- GNU base64
$ time (cat random-1gb.bin | base64 | pv -a > /dev/null)
[ 164MiB/s]
( cat random-1gb.bin | base64 | pv -a > /dev/null; ) 7.89s user 0.96s system 106% cpu 8.317 total
$ time (cat random-1gb.b64 | base64 --decode | pv -a > /dev/null)
[ 105MiB/s]
( cat random-1gb.b64 | base64 --decode | pv -a > /dev/null; ) 9.16s user 1.01s system 104% cpu 9.699 total
- race64 (C)
$ time (cat random-1gb.bin | ./race64 | pv -a > /dev/null)
[ 898MiB/s]
( cat random-1gb.bin | ./race64 | pv -a > /dev/null; ) 0.88s user 1.14s system 128% cpu 1.566 total
$ time (cat random-1gb.b64 | ./race64 -d | pv -a > /dev/null)
[ 723MiB/s]
( cat random-1gb.b64 | ./race64 -d | pv -a > /dev/null; ) 0.87s user 0.95s system 127% cpu 1.426 total
- rbase64
$ time (cat random-1gb.bin | rbase64 | pv -a > /dev/null)
[1.71GiB/s]
( cat random-1gb.bin | rbase64 | pv -a > /dev/null; ) 0.56s user 0.40s system 121% cpu 0.788 total
$ time (cat random-1gb.b64 | rbase64 --decode | pv -a > /dev/null)
[1.16GiB/s]
( cat random-1gb.b64 | rbase64 --decode | pv -a > /dev/null; ) 0.59s user 0.46s system 119% cpu 0.871 total
测试10GiB随机字节
- GNU base64
$ time (cat random-10gb.bin | base64 | pv -a > /dev/null)
[ 154MiB/s]
( cat random-10gb.bin | base64 | pv -a > /dev/null; ) 78.74s user 10.96s system 101% cpu 1:28.34 total
$ time (cat random-10gb.b64 | base64 --decode | pv -a > /dev/null)
[ 107MiB/s]
( cat random-10gb.b64 | base64 --decode | pv -a > /dev/null; ) 91.02s user 10.00s system 105% cpu 1:35.39 total
- race64 (C)
$ time (cat random-10gb.bin | ./race64 | pv -a > /dev/null)
[ 818MiB/s]
( cat random-10gb.bin | ./race64 | pv -a > /dev/null; ) 8.56s user 13.17s system 128% cpu 16.917 total
$ time (cat random-10gb.b64 | ./race64 -d | pv -a > /dev/null)
[ 724MiB/s]
( cat random-10gb.b64 | ./race64 -d | pv -a > /dev/null; ) 8.42s user 9.05s system 123% cpu 14.152 total
- rbase64
$ time (cat random-10gb.bin | rbase64 | pv -a > /dev/null)
[1.64GiB/s]
( cat random-10gb.bin | rbase64 | pv -a > /dev/null; ) 5.30s user 4.22s system 117% cpu 8.125 total
$ time (cat random-10gb.b64 | rbase64 --decode | pv -a > /dev/null)
[1.18GiB/s]
( cat random-10gb.b64 | rbase64 --decode | pv -a > /dev/null; ) 5.58s user 4.40s system 117% cpu 8.491 total
为了参考,这里是通过cat
管道文件而没有进行处理的吞吐量
$ time (cat random-10gb.b64 | pv -a > /dev/null)
[2.31GiB/s]
( cat random-10gb.b64 | pv -a > /dev/null; ) 0.88s user 4.72s system 95% cpu 5.858 total
许可证
本项目采用MIT和Apache 2.0双重许可。
依赖项
~0.5–1.3MB
~24K SLoC