这是我的基准程序:
extern crate zip;
use std::fs::File;
use std::io::copy;
use zip::write::FileOptions;
use zip::ZipWriter;
fn main() {
let mut src = File::open("/tmp/src.mxf").unwrap(); // 624 Mb file.
let dest = File::create("/tmp/test.zip").unwrap();
let mut zip_writer = ZipWriter::new(dest);
zip_writer
.start_file("src.mxf", FileOptions::default())
.unwrap();
copy(&mut src, &mut zip_writer).unwrap();
zip_writer.finish().unwrap();
}
Run Code Online (Sandbox Code Playgroud)
在发布模式下编译程序:
time ./zip_bench
./zip_bench 62,68s user 146,21s system 99% cpu 3:28,91 total
Run Code Online (Sandbox Code Playgroud)
使用系统zip二进制文件压缩的同一文件:
time zip /tmp/test2.zip /tmp/src.mxf
zip /tmp/test2.zip /tmp/src.mxf 13,77s user 0,19s system 99% cpu 13,965 total
Run Code Online (Sandbox Code Playgroud)
系统和Rust zip之间的时间因素大约是14倍(对于类似的输出文件,大小差别不大).
我在代码中做错了什么可以解释Rust性能?如何改进它以接近系统性能?
我没有你的测试数据,所以我在 3.7 GB Debian DVD ISO 上运行。我还假设您所说的“系统 zip”与 Arch zip 包大致相同。
从原始代码开始,更新 zip 箱,例如通过 deflate 帮助迁移到 flate2:
time ./zipbench
real 2m29.285s
user 2m23.396s
sys 0m4.066s
Run Code Online (Sandbox Code Playgroud)
time zip test2.zip debian-10.4.0-amd64-DVD-1.iso
adding: debian-10.4.0-amd64-DVD-1.iso (deflated 1%)
real 1m42.709s
user 1m38.066s
sys 0m3.386s
Run Code Online (Sandbox Code Playgroud)
zip 实用程序的速度大约只有两倍,而且我们甚至还没有更改我们的代码,只是将我们的板条箱和 Rust 更新了大约一年。
BufReader我们可以使用and将缓冲 IO 添加到 Rust 中BufWriter:
time ./zipbench
real 2m29.285s
user 2m23.396s
sys 0m4.066s
Run Code Online (Sandbox Code Playgroud)
这为我们带来了小幅性能提升,但不是很大:
time ./zipbench
real 2m25.348s
user 2m20.105s
sys 0m3.894s
Run Code Online (Sandbox Code Playgroud)
直接使用 flate2 可能会获得更快的速度,特别是如果您可以使用CloudFlare 的 Zlib 分支。不过,我还没有测试过这个。