2个版本 (1 个稳定版)
使用旧的Rust 2015
1.0.0 | 2019年9月12日 |
---|---|
0.1.0 | 2019年9月12日 |
#432 在 编码
12,371 每月下载量
用于 27 个crate (15 个直接使用)
155KB
3K SLoC
base64-compat
这就是base64。还有什么是人们想要的吗?
可能是一个稳定的API以及与较新Rust版本的兼容性?
本项目是 rust-base64 的分支,支持较旧版本的Rust。
此库的目标是 正确 和 快速。经过彻底测试和广泛使用。它以多个抽象级别公开功能,因此您可以选择所需方便性和性能之间的平衡,例如 decode_config_slice
将解码到现有的 &mut [u8]
,并且非常快(3 KiB输入的2.6GiB/s),而 decode_config
则分配一个新的 Vec<u8>
并返回它,这在某些情况下可能更方便,但速度较慢(尽管对于大多数用途来说仍然足够快)在 2.1 GiB/s。
示例
Cargo.toml 行: base64-compat = "1.0.0"
extern crate base64;
use base64::{encode, decode};
fn main() {
let a = b"hello world";
let b = "aGVsbG8gd29ybGQ=";
assert_eq!(encode(a), b);
assert_eq!(a, &decode(b).unwrap()[..]);
}
有关所有详细信息的文档
Rust版本兼容性
最低要求的Rust版本是1.19.0。
开发
基准测试在 benches/
中。运行它们需要nightly rust,但 rustup
可以轻松完成
rustup run nightly cargo bench
解码得到了一些预先计算表的辅助,这些表是通过
cargo run --example make_tables > src/tables.rs.tmp && mv src/tables.rs.tmp src/tables.rs
性能分析
在Linux上,您可以使用 perf 进行性能分析。然后使用 rustup nightly run cargo bench --no-run
编译基准测试。
使用 perf
运行基准二进制文件(此处显示为筛选特定的基准,这将使结果更易于阅读)。在大多数系统中,由于它需要操作 CPU 中的事件计数器,因此 perf
只对 root 用户可用,所以需要使用 sudo
。我们需要运行实际的基准二进制文件,因此路径进入 target
。您可以使用 rustup run nightly cargo bench -v
查看实际的完整路径;它将打印出它运行的命令。如果您使用 bench
输出的确切路径,请确保您得到的是用于基准测试的路径,而不是测试路径。您可能还想要运行 cargo clean
,以便只有一个 benchmarks-
二进制文件(它们往往会累积)。
sudo perf record target/release/deps/benchmarks-* --bench decode_10mib_reuse
然后使用 perf 分析结果
sudo perf annotate -l
您会看到一堆交织的 rust 源代码和汇编代码,如下所示。带有 lib.rs:327
的部分告诉我们,4.02% 的样本看到了 movzbl
也称为位移动作为活动的指令。然而,由于称为 skid 的现象,这个百分比并不像看起来那么精确。基本上,现代 CPU 的复杂性导致这种指令分析本质上是不准确的,尤其是在分支密集型代码中。
lib.rs:322 0.70 : 10698: mov %rdi,%rax
2.82 : 1069b: shr $0x38,%rax
: if morsel == decode_tables::INVALID_VALUE {
: bad_byte_index = input_index;
: break;
: };
: accum = (morsel as u64) << 58;
lib.rs:327 4.02 : 1069f: movzbl (%r9,%rax,1),%r15d
: // fast loop of 8 bytes at a time
: while input_index < length_of_full_chunks {
: let mut accum: u64;
:
: let input_chunk = BigEndian::read_u64(&input_bytes[input_index..(input_index + 8)]);
: morsel = decode_table[(input_chunk >> 56) as usize];
lib.rs:322 3.68 : 106a4: cmp $0xff,%r15
: if morsel == decode_tables::INVALID_VALUE {
0.00 : 106ab: je 1090e <base64::decode_config_buf::hbf68a45fefa299c1+0x46e>
模糊测试
这使用 cargo-fuzz。有关可用的模糊测试脚本,请参阅 fuzz/fuzzers
。要运行,请使用以下调用之一
cargo +nightly fuzz run roundtrip
cargo +nightly fuzz run roundtrip_no_pad
cargo +nightly fuzz run roundtrip_random_config -- -max_len=10240
cargo +nightly fuzz run decode_random
许可证
本项目是 rust-base64 项目的分支,该项目在 MIT 和 Apache 2.0 许可下双许可。因此,本项目也在 MIT 和 Apache 2.0 许可下双许可。