33次发布
0.11.3 | 2024年3月30日 |
---|---|
0.11.1 | 2023年6月19日 |
0.10.0 | 2023年1月30日 |
0.9.5 | 2022年9月3日 |
0.3.6 | 2020年10月19日 |
#4 在 压缩
1,672,350 每月下载量
在 495 个crate(125个直接使用) 中使用
170KB
3K SLoC
lz4_flex
在Rust中速度最快的LZ4实现。最初基于 redox-os的lz4压缩,但现在已经完全重写。表中的结果是该项目(66Kb JSON,10MB dickens)的基准测试结果,使用块格式。
AMD Ryzen 7 5900HX, rustc 1.69.0 (84c898d65 2023-04-16), Manjaro, CPU Boost禁用,CPU控制器:性能
66Kb JSON
压缩器 | 压缩 | 解压 | 比率 |
---|---|---|---|
lz4_flex unsafe w. unchecked_decode | 1615 MiB/s | 5973 MiB/s | 0.2284 |
lz4_flex unsafe | 1615 MiB/s | 5512 MiB/s | 0.2284 |
lz4_flex safe | 1272 MiB/s | 4540 MiB/s | 0.2284 |
lzzz (lz4 1.9.3) | 1469 MiB/s | 5313 MiB/s | 0.2283 |
lz4_fear | 662 MiB/s | 939 MiB/s | 0.2283 |
snap | 1452 MiB/s | 1649 MiB/s | 0.2242 |
10 Mb dickens
压缩器 | 压缩 | 解压 | 比率 |
---|---|---|---|
lz4_flex unsafe w. unchecked_decode | 347 MiB/s | 3168 MiB/s | 0.6372 |
lz4_flex unsafe | 347 MiB/s | 2734 MiB/s | 0.6372 |
lz4_flex safe | 259 MiB/s | 2338 MiB/s | 0.6372 |
lzzz (lz4 1.9.3) | 324 MiB/s | 2759 MiB/s | 0.6372 |
lz4_fear | 201 MiB/s | 370 MiB/s | 0.6372 |
snap | 286 MiB/s | 679 MiB/s | 0.6276 |
特性
- 非常好的标志
- LZ4块格式
- LZ4帧格式(感谢 @arthurprs)
- 高性能
- 1.5s干净的发布构建时间
- 功能标志以配置安全/不安全代码的使用
- 块格式支持no_std(感谢 @coolreader18)
- 32位支持
用法
压缩和解压缩通过默认功能标志“safe-encode”和“safe-decode”不使用不安全代码。如果您需要更高的性能,可以禁用它们(例如,使用no-default-features)。
安全
lz4_flex = { version = "0.11" }
性能
lz4_flex = { version = "0.11", default-features = false }
块格式
块格式仅适用于较小的数据块,因为块是在内存中解/压缩的。对于较大的数据,请使用帧格式,它由多个块组成。
use lz4_flex::block::{compress_prepend_size, decompress_size_prepended};
fn main(){
let input: &[u8] = b"Hello people, what's up?";
let compressed = compress_prepend_size(input);
let uncompressed = decompress_size_prepended(&compressed).unwrap();
assert_eq!(input, uncompressed);
}
no_std支持
当前no_std支持仅适用于块格式,因为帧格式使用std::io::Write
,这不在核心库中。
基准测试
基准测试使用criterion执行,测试文件位于benches文件夹。
目前比较了4个实现,包括这个,lz-fear,通过rust绑定的c版本和snappy。lz4-flex版本在启用和禁用safe-decode和safe-encode功能标志的情况下进行了测试。
- lz4_cpp: https://crates.io/crates/lzzzz
- lz-fear: https://github.com/main--/rust-lz-fear
- snap: https://github.com/burntsushi/rust-snappy
在AMD Ryzen 7 5900HX上测试,rustc 1.69.0 (84c898d65 2023-04-16),Manjaro,CPU Turbo关闭,CPU 3GHZ
结果 v0.11.0 02-06-2023(safe-decode和safe-encode关闭)
cargobench --no-default-features
结果 v0.11.0 02-06-2023(safe-decode和safe-encode开启)
cargobench
Miri
Miri可以用来查找与不正确的unsafe使用相关的问题
MIRIFLAGS="-Zmiri-disable-isolation -Zmiri-disable-stacked-borrows"cargo+nightly miri测试--no-default-features--features frame
Fuzzer
此模糊目标为解压缩器生成损坏的数据。cargo +nightly fuzz run fuzz_decomp_corrupt_block
和cargo +nightly fuzz run fuzz_decomp_corrupt_frame
此模糊目标断言压缩和解压缩往返操作返回原始输入。cargo +nightly fuzz run fuzz_roundtrip
和cargo +nightly fuzz run fuzz_roundtrip_frame
此模糊目标断言使用cpp压缩和解压缩使用lz4_flex返回原始输入。cargo +nightly fuzz run fuzz_roundtrip_cpp_compress
其他语言的绑定
TODO
- 高压缩
从v0.10迁移到v0.11.1
迁移时,只需删除如果使用了的checked-decode
功能标志。