From 827122e165922c4010096c8d9ad32913ae06ab9e Mon Sep 17 00:00:00 2001 From: pommicket Date: Mon, 4 Sep 2023 22:40:18 -0400 Subject: benchmark --- Cargo.toml | 7 +++++-- benches/bench.rs | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ benches/large.png | Bin 0 -> 7655145 bytes benches/small.png | Bin 0 -> 233 bytes pre-commit | 2 +- src/lib.rs | 2 +- test-all.sh | 8 ++++---- 7 files changed, 69 insertions(+), 8 deletions(-) create mode 100644 benches/bench.rs create mode 100644 benches/large.png create mode 100644 benches/small.png diff --git a/Cargo.toml b/Cargo.toml index 37e7c99..fe73293 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -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 new file mode 100644 index 0000000..f0344e5 Binary files /dev/null and b/benches/large.png differ diff --git a/benches/small.png b/benches/small.png new file mode 100644 index 0000000..47226a2 Binary files /dev/null and b/benches/small.png differ diff --git a/pre-commit b/pre-commit index 5055d4b..d086491 100755 --- a/pre-commit +++ b/pre-commit @@ -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 diff --git a/src/lib.rs b/src/lib.rs index 750a1f3..fa3bab9 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -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 -- cgit v1.2.3