#压缩解压 #lz4 #解压

no-std lz4_flex

在Rust中速度最快的LZ4实现,默认无安全隐患

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压缩

Download history 296226/week @ 2024-04-16 303607/week @ 2024-04-23 262533/week @ 2024-04-30 282578/week @ 2024-05-07 299645/week @ 2024-05-14 287564/week @ 2024-05-21 313256/week @ 2024-05-28 392094/week @ 2024-06-04 385958/week @ 2024-06-11 362284/week @ 2024-06-18 417632/week @ 2024-06-25 365886/week @ 2024-07-02 389464/week @ 2024-07-09 384208/week @ 2024-07-16 397744/week @ 2024-07-23 423177/week @ 2024-07-30

1,672,350 每月下载量
495 个crate(125个直接使用) 中使用

MIT 许可证

170KB
3K SLoC

Rust Docs Crates.io

lz4_flex

lz4_flex_logo

在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功能标志的情况下进行了测试。

在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

Compress

Decompress

结果 v0.11.0 02-06-2023(safe-decode和safe-encode开启)

cargobench

Compress

Decompress

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_blockcargo +nightly fuzz run fuzz_decomp_corrupt_frame

此模糊目标断言压缩和解压缩往返操作返回原始输入。cargo +nightly fuzz run fuzz_roundtripcargo +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功能标志。

依赖关系