26 个版本 (6 个稳定版)
新 1.21.0 | 2024年8月6日 |
---|---|
1.20.0 | 2024年4月4日 |
1.19.3 | 2024年2月28日 |
1.19.0 | 2023年9月19日 |
0.2.0 | 2019年10月6日 |
#18 在 压缩
25,365 每月下载次数
在 69 个crate中 使用 20 直接
450KB
9K SLoC
libdeflater
Rust语言对libdeflate的绑定,libdeflate是一个用于处理gzip/zlib/deflate数据的性能库。
libdeflater = "1.21.0"
libdeflater
是围绕libdeflate的一个薄层包装库。Libdeflate适用于输入数据在开始时就已知的或可以将(大型)输入数据集分成更小的块(例如,基因组bam文件,一些对象存储,专门的后端,游戏网络代码数据包)的应用程序。
这是一个围绕libdeflate的薄层库,
-
从源码构建libdeflate(参见libdeflate-sys的build.rs文件)
-
使用Rust绑定绑定到libdeflate的C API(参见lib.rs)
-
包含高级集成测试,以确保绑定工作(参见integration_test.rs)
-
包含使用示例和一个基准测试套件。基准测试套件表明在Calgary和Canterbury语料库上的速度提高了2-3倍(参见基准测试部分)
⚠️ 警告: libdeflate最适合于已知输入数据大致大小的专用用例。如果您需要支持流式传输的通用deflate库,则应使用类似flate2的工具。
示例
示例源码在此处。要运行示例
cargo run --example gz_compress.rs
cargo run --example gz_decompress.rs
基准测试
基准数据来自 卡尔加里语料库 和 坎特伯雷语料库。下方的基准表是根据以下步骤制作的
wget http://www.data-compression.info/files/corpora/largecalgarycorpus.zip
unzip -d bench_data largecalgarycorpus.zip
wget http://corpus.canterbury.ac.nz/resources/cantrbry.zip
unzip -d bench_data cantrbry.zip
# runs benchmarks against all files in `bench_data`
cargo bench
scripts/process-bench.rb encode
scripts/process-bench.rb decode
压缩
在此语料库上的平均加速比约为 2-3 倍
bench size [KB] speedup flate2 [us] libdeflate [us]
alice29.txt 152 3.1 5636 1821
asyoulik.txt 125 3.1 4911 1584
bib 111 2.9 3278 1133
book1 768 3.2 32697 10377
book2 610 2.8 19780 6975
cp.html 24 2.3 394 170
fields.c 11 2.4 155 65
geo 102 7.1 7717 1082
grammar.lsp 3 2.0 38 19
kennedy.xls 1029 7.3 46598 6427
lcet10.txt 426 3.0 14924 4931
news 377 2.5 10160 4052
obj1 21 2.6 385 149
obj2 246 3.5 7771 2218
paper1 53 2.4 1312 543
paper2 82 2.7 2608 955
paper3 46 2.5 1303 513
paper4 13 2.2 226 102
paper5 11 2.1 182 88
paper6 38 2.3 848 367
pic 513 3.8 7508 1990
plrabn12.txt 481 3.4 22527 6698
progc 39 2.4 882 361
progl 71 2.8 1553 559
progp 49 2.6 904 346
ptt5 513 3.8 7389 1964
sum 38 3.8 1124 297
trans 93 2.5 1595 650
xargs.1 4 1.9 40 21
解压
在此语料库上的平均加速比约为 2 倍。
bench size [KB] speedup flate2 [us] libdeflate [us]
alice29.txt 152 3.0 338 114
asyoulik.txt 125 2.8 300 106
bib 111 3.2 240 76
book1 768 2.5 1906 768
book2 610 2.7 1376 501
cp.html 24 2.0 31 16
fields.c 11 2.1 15 7
geo 102 2.3 359 160
grammar.lsp 3 1.8 7 4
kennedy.xls 1029 1.4 1241 911
lcet10.txt 426 2.8 919 325
news 377 2.4 969 400
obj1 21 1.9 41 21
obj2 246 2.5 558 220
paper1 53 3.2 109 34
paper2 82 3.1 182 58
paper3 46 3.0 100 34
paper4 13 1.9 22 12
paper5 11 1.9 21 11
paper6 38 3.0 75 25
pic 513 3.1 617 198
plrabn12.txt 481 2.5 1183 472
progc 39 3.1 76 25
progl 71 3.5 103 30
progp 49 3.0 65 22
ptt5 513 3.1 616 197
sum 38 2.5 75 31
trans 93 3.7 131 36
xargs.1 4 1.8 9 5
基准说明
-
所有基准均为单线程
-
未考虑 I/O/流开销。比较前将解压数据读入内存
-
与未设置功能标志的
flate2
进行比较(即miniz
实现)。选择flate2
是因为它是最受欢迎的。 -
在其他
flate2
后端上的比较可以在bench-flate2-miniz-oxide
和bench-flate2-zlib
分支上找到。对于一些语料库条目,zlib
后端要快约 8%。 -
两种情况下都使用默认压缩设置进行压缩
-
语料库条目使用
flate2
默认压缩级别进行压缩
编译时功能
您可以通过以下功能来定制构建
use_rust_alloc
:使 libdeflate 使用 Rust 的分配器而不是 libc 的分配器。当 Rust 预配置为使用 自定义全局分配器(例如,基于池的、跟踪的或其他)时,这很有用。freestanding
:以独立模式构建 libdeflate(不依赖 libc)。这对于没有 C stdlib 的目标很有用(例如wasm32-unknown-unknown
),否则它们将无法编译。隐含use_rust_alloc
。