我可以改善Rust拉链箱的不良性能吗?

Ben*_*ine 6 performance rust

这是我的基准程序:

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性能?如何改进它以接近系统性能?

c-x*_*ger 3

我没有你的测试数据,所以我在 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 分支。不过,我还没有测试过这个。