1 个不稳定版本
0.2.0 | 2023年3月15日 |
---|---|
0.1.0 |
|
#143 在 压缩 中
每月 33 次下载
用于 2 个 包
515KB
13K SLoC
lzfse_rust
Rust LZFSE实现。
文档
安装
只需配置你的 Cargo.toml
[dependencies]
lzfse_rust = "0.2"
概述
该包提供了两个LZFSE引擎:一个操作用户提供的内存缓冲区,另一个操作内部环形缓冲区。
内存缓冲区引擎直接与提供的输入和输出缓冲区工作。它通过 LzfseEncoder
和 LzfseDecoder
对象公开。我们会考虑在操作 &[u8]
和 Vec<u8>
对象时使用此引擎。
环形缓冲区引擎通过在内部环形缓冲区中流式传输数据来工作。它通过 LzfseRingEncoder
和 LzfseRingDecoder
对象公开。当在IO流上操作或希望公开 Read
或 Write
接口时,我们会考虑使用此引擎。
查看文档获取更多信息示例。
示例
此程序从 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_rust
比lzfse_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 License,版本2.0(LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
贡献
除非你明确声明,否则任何有意提交以包含在作品中的贡献,根据Apache-2.0许可证定义,应按上述方式双许可,无需附加条款或条件。