#base64 #decode #encode #codec #command-line-tool

bin+lib rbase64

一个快速的多线程 base64 编码库和 CLI 工具

16 个稳定版本

2.0.3 2022 年 11 月 28 日
2.0.2 2022 年 11 月 26 日
1.5.0 2022 年 11 月 25 日

编码 中排名 1183

Download history 180/week @ 2024-03-13 192/week @ 2024-03-20 1661/week @ 2024-03-27 995/week @ 2024-04-03 761/week @ 2024-04-10 453/week @ 2024-04-17 660/week @ 2024-04-24 574/week @ 2024-05-01 3008/week @ 2024-05-08 957/week @ 2024-05-15 354/week @ 2024-05-22 275/week @ 2024-05-29 269/week @ 2024-06-05 379/week @ 2024-06-12 233/week @ 2024-06-19 158/week @ 2024-06-26

每月下载量 1,073
2 crates 中使用

MIT/Apache 许可证

62KB
378

rbase64

rbase64 是一个快速的多线程 base64 编码/解码库和 CLI 工具,由 Rust 编写。

Crates.io Crates.io Build Status Coverage Status License License


你是否曾经想要对数十吉字节的数据进行 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