diff options
-rw-r--r-- | Cargo.toml | 7 | ||||
-rw-r--r-- | benches/bench.rs | 58 | ||||
-rw-r--r-- | benches/large.png | bin | 0 -> 7655145 bytes | |||
-rw-r--r-- | benches/small.png | bin | 0 -> 233 bytes | |||
-rwxr-xr-x | pre-commit | 2 | ||||
-rw-r--r-- | src/lib.rs | 2 | ||||
-rwxr-xr-x | test-all.sh | 8 |
7 files changed, 69 insertions, 8 deletions
@@ -3,12 +3,15 @@ name = "tiny-png" version = "0.1.0" edition = "2021" -[dependencies] - [dev-dependencies] +criterion = { version = "0.5.1", features = ["html_reports"] } png = "0.17.10" [features] default = ["std"] std = [] adler = [] + +[[bench]] +name = "bench" +harness = false diff --git a/benches/bench.rs b/benches/bench.rs new file mode 100644 index 0000000..a8c13ba --- /dev/null +++ b/benches/bench.rs @@ -0,0 +1,58 @@ +use criterion::{criterion_group, criterion_main, Criterion}; +use std::hint::black_box; + +fn run_benches(c: &mut Criterion) { + let large_image = black_box(std::fs::read("benches/large.png").unwrap()); + let small_image = black_box(std::fs::read("benches/small.png").unwrap()); + + let mut group = c.benchmark_group("large-image"); + group.sample_size(50); + + group.bench_function("tiny-png", |b| { + b.iter(|| { + let mut png = &large_image[..]; + let header = tiny_png::read_png_header(&mut png).unwrap(); + let mut buf = vec![0; header.required_bytes()]; + let data = tiny_png::read_png(&mut png, Some(&header), &mut buf).unwrap(); + std::hint::black_box(data); + }) + }); + + group.bench_function("png", |b| { + b.iter(|| { + let png = &large_image[..]; + let decoder = png::Decoder::new(png); + let mut reader = decoder.read_info().unwrap(); + let mut png_buf = vec![0; reader.output_buffer_size()]; + reader.next_frame(&mut png_buf).unwrap(); + std::hint::black_box(png_buf); + }) + }); + group.finish(); + + let mut group = c.benchmark_group("small-image"); + group.sample_size(1000); + group.bench_function("tiny-png", |b| { + b.iter(|| { + let mut png = &small_image[..]; + let header = tiny_png::read_png_header(&mut png).unwrap(); + let mut buf = vec![0; header.required_bytes()]; + let data = tiny_png::read_png(&mut png, Some(&header), &mut buf).unwrap(); + std::hint::black_box(data); + }) + }); + group.bench_function("png", |b| { + b.iter(|| { + let png = &small_image[..]; + let decoder = png::Decoder::new(png); + let mut reader = decoder.read_info().unwrap(); + let mut png_buf = vec![0; reader.output_buffer_size()]; + reader.next_frame(&mut png_buf).unwrap(); + std::hint::black_box(png_buf); + }) + }); + group.finish(); +} + +criterion_group!(benches, run_benches); +criterion_main!(benches); diff --git a/benches/large.png b/benches/large.png Binary files differnew file mode 100644 index 0000000..f0344e5 --- /dev/null +++ b/benches/large.png diff --git a/benches/small.png b/benches/small.png Binary files differnew file mode 100644 index 0000000..47226a2 --- /dev/null +++ b/benches/small.png @@ -3,4 +3,4 @@ cd $(git rev-parse --show-toplevel) cargo fmt || exit 1 cargo clippy -- -D warnings || exit 1 -git add -u src +git add -u src benches test examples @@ -506,7 +506,7 @@ impl<'a> DecompressedDataWriter<'a> { const HUFFMAN_MAX_CODES: usize = 286; const HUFFMAN_MAX_BITS: u8 = 15; -const HUFFMAN_MAIN_TABLE_BITS: u8 = 11; +const HUFFMAN_MAIN_TABLE_BITS: u8 = 10; const HUFFMAN_MAIN_TABLE_SIZE: usize = 1 << HUFFMAN_MAIN_TABLE_BITS; const HUFFMAN_SUBTABLE_SIZE: usize = 1 << (HUFFMAN_MAX_BITS - HUFFMAN_MAIN_TABLE_BITS); #[derive(Debug)] diff --git a/test-all.sh b/test-all.sh index c15341a..cb7f19a 100755 --- a/test-all.sh +++ b/test-all.sh @@ -2,8 +2,8 @@ # test all feature sets for mode in '' '--release'; do - cargo t $mode - cargo t $mode --no-default-features - cargo t $mode --features adler - cargo t $mode --no-default-features --features adler + cargo t $mode || exit 1 + cargo t $mode --no-default-features || exit 1 + cargo t $mode --features adler || exit 1 + cargo t $mode --no-default-features --features adler || exit 1 done |