1 个不稳定版本

0.2.0 2023年3月15日
0.1.0 2021年4月23日

#143压缩

每月 33 次下载
用于 2 个

MIT/Apache

515KB
13K SLoC

lzfse_rust

Rust LZFSE实现。

文档

https://docs.rs/lzfse_rust

安装

只需配置你的 Cargo.toml

[dependencies]
lzfse_rust = "0.2"

概述

该包提供了两个LZFSE引擎:一个操作用户提供的内存缓冲区,另一个操作内部环形缓冲区。

内存缓冲区引擎直接与提供的输入和输出缓冲区工作。它通过 LzfseEncoderLzfseDecoder 对象公开。我们会考虑在操作 &[u8]Vec<u8> 对象时使用此引擎。

环形缓冲区引擎通过在内部环形缓冲区中流式传输数据来工作。它通过 LzfseRingEncoderLzfseRingDecoder 对象公开。当在IO流上操作或希望公开 ReadWrite 接口时,我们会考虑使用此引擎。

查看文档获取更多信息示例。

示例

此程序从 stdin 压缩数据到 stdout。此示例位于 examples/compress_ring.rs

use lzfse_rust::LzfseRingEncoder;
use std::io;

fn main() -> io::Result<()> {
    let mut rdr = io::stdin();
    let mut wtr = io::stdout();
    let mut encoder = LzfseRingEncoder::default();
    encoder.encode(&mut rdr, &mut wtr)?;
    Ok(())
}

此程序从 stdin 解压缩数据到 stdout。此示例位于 examples/decompress_ring.rs

use lzfse_rust::LzfseRingDecoder;
use std::io;

fn main() -> io::Result<()> {
    let mut rdr = io::stdin();
    let mut wtr = io::stdout();
    let mut decoder = LzfseRingDecoder::default();
    decoder.decode(&mut rdr, &mut wtr)?;
    Ok(())
}

命令行工具:lzfoo

一个快速、内存高效且支持流的 lzfse 命令行工具克隆。由 lzfse_rust 提供。

安装。

$ cargo install lzfoo

a.txt 压缩为 a.txt.lzfse

$ lzfoo -encode -i a.txt -o a.txt.lzfse

使用 stdin/ stdout 压缩

$ lzfoo -encode -i < a.txt > a.txt.lzfse
$ echo "semper fidelis" | lzfoo -encode > a.txt.lzfse

a.txt.lzfse 解压缩为 a.txt

$ lzfoo -decode -i a.txt.lzfse -o a.txt

使用 stdin/ stdout 解压缩

$ lzfoo -decode -i < a.txt.lzfse > a.txt

查看 lzfoo 包 获取详细信息。

测试

这个crate包含一个全面的测试套件,分为单元测试和集成测试。单元测试检查库的内部组件是否正常工作,而集成测试则检查整个库是否正常工作。扩展测试可用,但可能需要数小时才能完成。

单元测试

$ cargo test

扩展单元测试

$ cargo test -- --ignored

集成测试

$ cargo test --manifest-path test/Cargo.toml

扩展集成测试

$ cargo test --manifest-path test/Cargo.toml -- --ignored

还有额外的集成测试可用。特别是与参考LZFSE实现的验证测试。这些内容在测试中描述,以及如何构建和运行它们的说明。

性能

作为一个库,在指定的测试机器上,lzfse_rustlzfse_ref表现更好。然而,结果会因不同机器而异。

基准测试由Criterion提供支持,并用critcmp格式化。机器是8GB Intel i5-2500K,运行Ubuntu 18.04(64位)。数据集来自Snappy。基准测试源代码在这里,以及如何构建和运行基准测试的说明。

group                          new/lzfse_ref/                         new/rust/                              new/rust_ring/
-----                          --------------                         ---------                              --------------
decode/snap_uflat00_html       1.24    119.6±0.11µs   816.8 MB/sec    1.07    103.3±0.03µs   945.7 MB/sec    1.00     96.2±0.04µs  1014.9 MB/sec
decode/snap_uflat01_urls       1.18   1407.8±3.84µs   475.6 MB/sec    1.02   1211.8±0.11µs   552.5 MB/sec    1.00   1193.0±3.27µs   561.2 MB/sec
decode/snap_uflat02_jpg        1.07    353.7±0.05µs   331.9 MB/sec    1.00    330.7±0.91µs   355.0 MB/sec    1.02    336.1±0.85µs   349.3 MB/sec
decode/snap_uflat04_pdf        1.07    243.6±0.07µs   400.8 MB/sec    1.00    227.7±0.04µs   429.0 MB/sec    1.00    228.7±0.04µs   427.0 MB/sec
decode/snap_uflat05_html4      1.13    140.1±0.08µs     2.7 GB/sec    1.00    123.4±0.36µs     3.1 GB/sec    1.12    138.4±0.04µs     2.8 GB/sec
decode/snap_uflat06_txt1       1.22    469.4±0.05µs   309.0 MB/sec    1.09    420.8±1.21µs   344.7 MB/sec    1.00    384.3±0.05µs   377.4 MB/sec
decode/snap_uflat07_txt2       1.20    410.2±1.18µs   291.0 MB/sec    1.10    373.4±0.01µs   319.7 MB/sec    1.00    340.9±0.02µs   350.2 MB/sec
decode/snap_uflat08_txt3       1.25   1255.5±0.12µs   324.2 MB/sec    1.09   1096.9±3.32µs   371.0 MB/sec    1.00   1006.9±0.15µs   404.2 MB/sec
decode/snap_uflat09_txt4       1.18   1628.8±0.25µs   282.1 MB/sec    1.10   1511.5±3.03µs   304.0 MB/sec    1.00   1376.4±0.11µs   333.9 MB/sec
decode/snap_uflat10_pb         1.17    101.7±0.04µs  1112.3 MB/sec    1.04     90.2±0.03µs  1254.1 MB/sec    1.00     86.7±0.04µs  1304.3 MB/sec
decode/snap_uflat11_gaviota    1.28    486.0±0.05µs   361.7 MB/sec    1.09    413.2±0.05µs   425.4 MB/sec    1.00    379.5±0.03µs   463.1 MB/sec
encode/snap_uflat00_html       1.83   1500.0±3.76µs    65.1 MB/sec    1.00    821.1±0.09µs   118.9 MB/sec    1.10    905.9±0.11µs   107.8 MB/sec
encode/snap_uflat01_urls       1.45     13.1±0.00ms    51.3 MB/sec    1.00      9.0±0.00ms    74.2 MB/sec    1.01      9.1±0.00ms    73.8 MB/sec
encode/snap_uflat02_jpg        1.11      2.1±0.01ms    55.4 MB/sec    1.00   1910.0±5.33µs    61.5 MB/sec    1.12      2.1±0.00ms    54.7 MB/sec
encode/snap_uflat04_pdf        1.11   1695.1±0.19µs    57.6 MB/sec    1.00   1528.3±0.15µs    63.9 MB/sec    1.12   1705.8±0.16µs    57.3 MB/sec
encode/snap_uflat05_html4      5.10      4.4±0.00ms    89.7 MB/sec    1.00    854.4±0.08µs   457.2 MB/sec    1.12    954.2±0.11µs   409.4 MB/sec
encode/snap_uflat06_txt1       1.36      3.6±0.01ms    40.4 MB/sec    1.00      2.6±0.00ms    55.1 MB/sec    1.01      2.7±0.01ms    54.6 MB/sec
encode/snap_uflat07_txt2       1.34      3.1±0.01ms    38.5 MB/sec    1.01      2.3±0.00ms    51.2 MB/sec    1.00      2.3±0.00ms    51.8 MB/sec
encode/snap_uflat08_txt3       1.37      9.5±0.00ms    42.6 MB/sec    1.00      7.0±0.01ms    58.5 MB/sec    1.02      7.1±0.02ms    57.6 MB/sec
encode/snap_uflat09_txt4       1.34     12.3±0.04ms    37.3 MB/sec    1.00      9.3±0.00ms    49.7 MB/sec    1.00      9.2±0.00ms    49.9 MB/sec
encode/snap_uflat10_pb         1.95   1568.4±3.90µs    72.1 MB/sec    1.00    802.5±0.08µs   140.9 MB/sec    1.14    915.6±0.11µs   123.5 MB/sec
encode/snap_uflat11_gaviota    1.49      3.5±0.00ms    50.2 MB/sec    1.00      2.4±0.00ms    74.8 MB/sec    1.01      2.4±0.00ms    73.9 MB/sec
Key:
lzfse_ref: lzfse reference library
rust     : lzfse_rust
rust_ring: lzfse_rust ring

Column: 1 2 3
1: relative time                    lower is better, 1.00 is the fastest 
2: mean time ± standard deviation   lower is better
3: throughput                       higher is better

最小Rust版本策略

此crate支持的最小rustc版本是1.51.0

许可证

许可协议为以下之一

任选其一。

贡献

除非你明确声明,否则任何有意提交以包含在作品中的贡献,根据Apache-2.0许可证定义,应按上述方式双许可,无需附加条款或条件。

替代方案

无运行时依赖