1 use bencher::{benchmark_group, benchmark_main};
2 
3 use std::io::{Cursor, Read, Write};
4 
5 use bencher::Bencher;
6 use getrandom::getrandom;
7 use zip::{ZipArchive, ZipWriter};
8 
generate_random_archive(size: usize) -> Vec<u8>9 fn generate_random_archive(size: usize) -> Vec<u8> {
10     let data = Vec::new();
11     let mut writer = ZipWriter::new(Cursor::new(data));
12     let options =
13         zip::write::FileOptions::default().compression_method(zip::CompressionMethod::Stored);
14 
15     writer.start_file("random.dat", options).unwrap();
16     let mut bytes = vec![0u8; size];
17     getrandom(&mut bytes).unwrap();
18     writer.write_all(&bytes).unwrap();
19 
20     writer.finish().unwrap().into_inner()
21 }
22 
read_entry(bench: &mut Bencher)23 fn read_entry(bench: &mut Bencher) {
24     let size = 1024 * 1024;
25     let bytes = generate_random_archive(size);
26     let mut archive = ZipArchive::new(Cursor::new(bytes.as_slice())).unwrap();
27 
28     bench.iter(|| {
29         let mut file = archive.by_name("random.dat").unwrap();
30         let mut buf = [0u8; 1024];
31         loop {
32             let n = file.read(&mut buf).unwrap();
33             if n == 0 {
34                 break;
35             }
36         }
37     });
38 
39     bench.bytes = size as u64;
40 }
41 
42 benchmark_group!(benches, read_entry);
43 benchmark_main!(benches);
44