Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
3ff65cd
feat: remove magic
Its-Just-Nans Mar 18, 2026
1810460
add size of magic
Its-Just-Nans Mar 18, 2026
81a1027
cargo fmt
Its-Just-Nans Mar 18, 2026
28cb5ee
change name
Its-Just-Nans Mar 18, 2026
1ab12f1
cleaner to use size_of
Its-Just-Nans Mar 18, 2026
9fd3225
update code
Its-Just-Nans Mar 18, 2026
9e679e3
remove eprintln
Its-Just-Nans Mar 18, 2026
5e2b308
put as boxed
Its-Just-Nans Mar 18, 2026
ac727ab
Update read.rs
Its-Just-Nans Mar 18, 2026
10869c9
Move to specs
Its-Just-Nans Mar 18, 2026
f74100b
move to spec.rs
Its-Just-Nans Mar 18, 2026
171bac0
Update types.rs
Its-Just-Nans Mar 18, 2026
5533849
Create datetime.rs
Its-Just-Nans Mar 18, 2026
87c775a
Update types.rs
Its-Just-Nans Mar 18, 2026
99cc870
Update datetime.rs
Its-Just-Nans Mar 18, 2026
093b1bc
Update read.rs
Its-Just-Nans Mar 18, 2026
5bed490
Update types.rs
Its-Just-Nans Mar 18, 2026
620a5f2
Update spec.rs
Its-Just-Nans Mar 18, 2026
7c2b93a
Update spec.rs
Its-Just-Nans Mar 18, 2026
e657185
Update read.rs
Its-Just-Nans Mar 18, 2026
d01b529
Update types.rs
Its-Just-Nans Mar 18, 2026
9181199
Update types.rs
Its-Just-Nans Mar 18, 2026
069e5e6
Update datetime.rs
Its-Just-Nans Mar 18, 2026
897d9ef
Update lib.rs
Its-Just-Nans Mar 18, 2026
2424622
Update types.rs
Its-Just-Nans Mar 18, 2026
9c0f1a9
Update datetime.rs
Its-Just-Nans Mar 18, 2026
c99429d
Update datetime.rs
Its-Just-Nans Mar 18, 2026
5ca7163
Update lib.rs
Its-Just-Nans Mar 18, 2026
084cfb2
Update read.rs
Its-Just-Nans Mar 18, 2026
efe7f8f
Update stream.rs
Its-Just-Nans Mar 18, 2026
96f87df
Update types.rs
Its-Just-Nans Mar 18, 2026
b48a8dd
Update write.rs
Its-Just-Nans Mar 18, 2026
7c62f70
Update spec.rs
Its-Just-Nans Mar 18, 2026
7323f91
cargo fmt
Its-Just-Nans Mar 18, 2026
85dcb1c
fix and merge
Its-Just-Nans Mar 18, 2026
85446f0
cargo fmt
Its-Just-Nans Mar 18, 2026
56acd33
sync && merge
Its-Just-Nans Mar 18, 2026
ceed8b2
no vec
Its-Just-Nans Mar 18, 2026
f6bb26d
refactor: clean up part of the code
Its-Just-Nans Mar 19, 2026
ae5e3e0
use core::fmt
Its-Just-Nans Mar 19, 2026
093e62d
cargo fmt
Its-Just-Nans Mar 19, 2026
8d763a7
update imports
Its-Just-Nans Mar 19, 2026
3ff0cc0
fix import
Its-Just-Nans Mar 19, 2026
66697ce
fix imports
Its-Just-Nans Mar 19, 2026
4176c68
fix mod tests
Its-Just-Nans Mar 19, 2026
f4b36ab
Merge branch 'master' into more-refact
Its-Just-Nans Mar 19, 2026
7da1762
resync
Its-Just-Nans Mar 19, 2026
df1f9ac
Merge branch 'more-refact' into remove-useless-magic
Its-Just-Nans Mar 19, 2026
c93682b
resync
Its-Just-Nans Mar 19, 2026
d3f38f1
Merge branch 'master' into remove-useless-magic
Its-Just-Nans Mar 19, 2026
f20b626
add bench
Its-Just-Nans Mar 19, 2026
621208d
update bench
Its-Just-Nans Mar 20, 2026
6e737ad
use io sink
Its-Just-Nans Mar 20, 2026
2f6ac91
add bufReader
Its-Just-Nans Mar 20, 2026
e42ae60
move to becnh
Its-Just-Nans Mar 20, 2026
26d6f9c
fix endianness
Its-Just-Nans Mar 20, 2026
351517f
Merge branch 'master' into remove-useless-magic
Its-Just-Nans Mar 21, 2026
146183c
cargo fmt
Its-Just-Nans Mar 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,10 @@ harness = false
name = "read_metadata"
harness = false

[[bench]]
name = "read_many_entries"
harness = false

[[bench]]
name = "merge_archive"
harness = false
2 changes: 1 addition & 1 deletion benches/read_entry.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,9 @@ fn read_entry(bench: &mut Bencher) {
let size = 1024 * 1024;
let bytes = generate_random_archive(size)
.expect("Failed to create a random archive for the bench read_entry()");
let mut archive = ZipArchive::new(Cursor::new(bytes.as_slice())).unwrap();

bench.iter(|| {
let mut archive = ZipArchive::new(Cursor::new(bytes.as_slice())).unwrap();
let mut file = archive.by_name("random.dat").unwrap();
let mut buf = [0u8; 1024];
loop {
Expand Down
94 changes: 94 additions & 0 deletions benches/read_many_entries.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
use bencher::{benchmark_group, benchmark_main};

use std::fs::File;
use std::io::{Cursor, Write};

use bencher::Bencher;
use zip::{ZipArchive, ZipWriter, write::SimpleFileOptions};

const NB_FILES: usize = 100;
const FILENAME: &str = "bench_read_many_entries.zip";

fn generate_random_archive(size: usize) -> Result<Vec<u8>, std::io::Error> {
let data = Vec::new();
let mut writer = ZipWriter::new(Cursor::new(data));
let options = SimpleFileOptions::default().compression_method(zip::CompressionMethod::Stored);
for count in 0..NB_FILES {
writer.start_file(format!("random_{}.dat", count), options)?;
let mut bytes = vec![0u8; size];
getrandom::fill(&mut bytes)
.map_err(|e| std::io::Error::other(format!("getrandom error: {}", e)))?;
writer.write_all(&bytes)?;
}
let w = writer.finish()?;

Ok(w.into_inner())
}

fn generate_random_archive_to_file(size: usize) -> Result<(), std::io::Error> {
let bytes = generate_random_archive(size)?;
let mut file = File::create(FILENAME)?;
file.write_all(&bytes)?;
Ok(())
}

fn read_many_entries_as_file(bench: &mut Bencher) {
let size = 1024 * 1024;
generate_random_archive_to_file(size)
.expect("Failed to create a random archive for the bench read_entry()");

bench.iter(|| {
let file = File::open(FILENAME).unwrap();
let mut archive = ZipArchive::new(file).unwrap();
for idx in 0..archive.len() {
let mut file = archive.by_index(idx).unwrap();
let _n = std::io::copy(&mut file, &mut std::io::sink()).unwrap();
}
});

bench.bytes = (size * NB_FILES) as u64;
std::fs::remove_file(FILENAME).unwrap();
}

fn read_many_entries_as_file_buf(bench: &mut Bencher) {
let size = 1024 * 1024;
generate_random_archive_to_file(size)
.expect("Failed to create a random archive for the bench read_entry()");

bench.iter(|| {
let file = File::open(FILENAME).unwrap();
let file = std::io::BufReader::new(file);
let mut archive = ZipArchive::new(file).unwrap();
for idx in 0..archive.len() {
let mut file = archive.by_index(idx).unwrap();
let _n = std::io::copy(&mut file, &mut std::io::sink()).unwrap();
}
});

bench.bytes = (size * NB_FILES) as u64;
std::fs::remove_file(FILENAME).unwrap();
}

fn read_many_entries(bench: &mut Bencher) {
let size = 1024 * 1024;
let bytes = generate_random_archive(size)
.expect("Failed to create a random archive for the bench read_entry()");

bench.iter(|| {
let mut archive = ZipArchive::new(Cursor::new(bytes.as_slice())).unwrap();
for idx in 0..archive.len() {
let mut file = archive.by_index(idx).unwrap();
let _n = std::io::copy(&mut file, &mut std::io::sink()).unwrap();
}
});

bench.bytes = (size * NB_FILES) as u64;
}

benchmark_group!(
benches,
read_many_entries,
read_many_entries_as_file,
read_many_entries_as_file_buf
);
benchmark_main!(benches);
18 changes: 12 additions & 6 deletions src/read/stream.rs
Original file line number Diff line number Diff line change
Expand Up @@ -236,15 +236,18 @@ pub fn read_zipfile_from_stream<R: Read>(reader: &mut R) -> ZipResult<Option<Zip
// finished iterating over all the actual files).
/* TODO: smallvec? */

let mut block = ZipLocalEntryBlock::zeroed();
reader.read_exact(block.as_bytes_mut())?;
let mut magic_buf = [0; size_of::<u32>()];
reader.read_exact(&mut magic_buf)?;

match block.magic().from_le() {
match Magic::from_le_bytes(magic_buf) {
Magic::LOCAL_FILE_HEADER_SIGNATURE => (),
Magic::CENTRAL_DIRECTORY_HEADER_SIGNATURE => return Ok(None),
_ => return Err(ZipLocalEntryBlock::WRONG_MAGIC_ERROR),
}

let mut block = ZipLocalEntryBlock::zeroed();
reader.read_exact(block.as_bytes_mut())?;

let block = block.from_le();

let mut result = ZipFileData::from_local_block(block, reader)?;
Expand Down Expand Up @@ -284,15 +287,18 @@ pub fn read_zipfile_from_stream_with_compressed_size<R: io::Read>(
reader: &mut R,
compressed_size: u64,
) -> ZipResult<Option<ZipFile<'_, R>>> {
let mut block = ZipLocalEntryBlock::zeroed();
reader.read_exact(block.as_bytes_mut())?;
let mut magic_buf = [0; size_of::<u32>()];
reader.read_exact(&mut magic_buf)?;

match block.magic().from_le() {
match Magic::from_le_bytes(magic_buf) {
Magic::LOCAL_FILE_HEADER_SIGNATURE => (),
Magic::CENTRAL_DIRECTORY_HEADER_SIGNATURE => return Ok(None),
_ => return Err(ZipLocalEntryBlock::WRONG_MAGIC_ERROR),
}

let mut block = ZipLocalEntryBlock::zeroed();
reader.read_exact(block.as_bytes_mut())?;

let block = block.from_le();

let mut result = ZipFileData::from_local_block(block, reader)?;
Expand Down
Loading
Loading