Skip to content

Commit 2731e7e

Browse files
add benchmarks for iterating through entries
1 parent 568fcab commit 2731e7e

File tree

5 files changed

+122
-4
lines changed

5 files changed

+122
-4
lines changed

Cargo.toml

+4
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,10 @@ default = [
9494
name = "read_entry"
9595
harness = false
9696

97+
[[bench]]
98+
name = "decompress_sink"
99+
harness = false
100+
97101
[[bench]]
98102
name = "read_metadata"
99103
harness = false

benches/decompress_sink.rs

+112
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
#![cfg(all(feature = "_deflate-any", feature = "bzip2"))]
2+
3+
use bencher::{benchmark_group, benchmark_main};
4+
5+
use std::fs;
6+
use std::io::prelude::*;
7+
use std::path::Path;
8+
9+
use bencher::Bencher;
10+
11+
use zip::read::stream::{ZipStreamFileMetadata, ZipStreamReader, ZipStreamVisitor};
12+
use zip::read::ZipFile;
13+
use zip::unstable::read::streaming::StreamingArchive;
14+
use zip::{result::ZipResult, ZipArchive};
15+
16+
/* This contains the compressed text of King Lear from Project Gutenberg, in the public domain. */
17+
fn get_test_data() -> ZipResult<ZipArchive<fs::File>> {
18+
let path = Path::new(env!("CARGO_MANIFEST_DIR")).join("tests/data/king-lear-compressed.zip");
19+
let file = fs::File::open(path)?;
20+
ZipArchive::new(file)
21+
}
22+
23+
fn write_entry_to_sink_generic(bench: &mut Bencher) {
24+
let mut archive = get_test_data().unwrap();
25+
let total_size: u64 = archive.decompressed_size().unwrap().try_into().unwrap();
26+
27+
bench.bytes = total_size;
28+
bench.bench_n(1, |bench| {
29+
bench.iter(|| {
30+
for i in 0..archive.len() {
31+
let mut f = archive.by_index_generic(i).unwrap();
32+
std::io::copy(&mut f, &mut std::io::sink()).unwrap();
33+
}
34+
})
35+
});
36+
}
37+
38+
fn write_entry_to_sink_standard(bench: &mut Bencher) {
39+
let mut archive = get_test_data().unwrap();
40+
let total_size: u64 = archive.decompressed_size().unwrap().try_into().unwrap();
41+
42+
bench.bytes = total_size;
43+
bench.bench_n(1, |bench| {
44+
bench.iter(|| {
45+
for i in 0..archive.len() {
46+
let mut f = archive.by_index(i).unwrap();
47+
std::io::copy(&mut f, &mut std::io::sink()).unwrap();
48+
}
49+
})
50+
});
51+
}
52+
53+
fn write_stream_to_sink_generic(bench: &mut Bencher) {
54+
let archive = get_test_data().unwrap();
55+
let total_size: u64 = archive.decompressed_size().unwrap().try_into().unwrap();
56+
57+
let mut reader = archive.into_inner();
58+
59+
bench.bytes = total_size;
60+
bench.bench_n(1, |bench| {
61+
bench.iter(|| {
62+
reader.rewind().unwrap();
63+
let mut stream_zip = StreamingArchive::new(&mut reader);
64+
65+
while let Some(mut file) = stream_zip.next_entry().unwrap() {
66+
std::io::copy(&mut file, &mut std::io::sink()).unwrap();
67+
}
68+
while stream_zip.next_metadata_entry().unwrap().is_some() {}
69+
})
70+
});
71+
}
72+
73+
fn write_stream_to_sink_standard(bench: &mut Bencher) {
74+
let archive = get_test_data().unwrap();
75+
let total_size: u64 = archive.decompressed_size().unwrap().try_into().unwrap();
76+
77+
struct V;
78+
impl ZipStreamVisitor for V {
79+
fn visit_file(&mut self, file: &mut ZipFile) -> ZipResult<()> {
80+
std::io::copy(file, &mut std::io::sink())?;
81+
Ok(())
82+
}
83+
fn visit_additional_metadata(
84+
&mut self,
85+
_metadata: &ZipStreamFileMetadata,
86+
) -> ZipResult<()> {
87+
Ok(())
88+
}
89+
}
90+
91+
let mut reader = archive.into_inner();
92+
93+
bench.bytes = total_size;
94+
bench.bench_n(1, |bench| {
95+
bench.iter(|| {
96+
reader.rewind().unwrap();
97+
let stream_zip = ZipStreamReader::new(&mut reader);
98+
99+
stream_zip.visit(&mut V).unwrap();
100+
})
101+
});
102+
}
103+
104+
benchmark_group!(
105+
benches,
106+
write_entry_to_sink_generic,
107+
write_entry_to_sink_standard,
108+
write_stream_to_sink_generic,
109+
write_stream_to_sink_standard,
110+
);
111+
112+
benchmark_main!(benches);

benches/read_entry.rs

+5-3
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
use bencher::{benchmark_group, benchmark_main};
22

3-
use std::io::{Cursor, Read, Write};
3+
use std::io::{prelude::*, Cursor};
44

55
use bencher::Bencher;
66
use getrandom::getrandom;
7-
use zip::{write::SimpleFileOptions, ZipArchive, ZipWriter};
7+
8+
use zip::{write::SimpleFileOptions, CompressionMethod, ZipArchive, ZipWriter};
89

910
fn generate_random_archive(size: usize) -> Vec<u8> {
1011
let data = Vec::new();
1112
let mut writer = ZipWriter::new(Cursor::new(data));
12-
let options = SimpleFileOptions::default().compression_method(zip::CompressionMethod::Stored);
13+
let options = SimpleFileOptions::default().compression_method(CompressionMethod::Stored);
1314

1415
writer.start_file("random.dat", options).unwrap();
1516
let mut bytes = vec![0u8; size];
@@ -39,4 +40,5 @@ fn read_entry(bench: &mut Bencher) {
3940
}
4041

4142
benchmark_group!(benches, read_entry);
43+
4244
benchmark_main!(benches);

src/read.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ mod config;
3434
pub use config::*;
3535

3636
/// Provides high level API for reading from a stream.
37-
pub(crate) mod stream;
37+
pub mod stream;
3838

3939
#[cfg(feature = "lzma")]
4040
pub(crate) mod lzma;

tests/data/king-lear-compressed.zip

14.8 MB
Binary file not shown.

0 commit comments

Comments
 (0)