diff --git a/Cargo.toml b/Cargo.toml index d1531f7..36ec8f4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -54,6 +54,10 @@ harness = false name = "encode" harness = false +[[bench]] +name = "decode" +harness = false + [[test]] name = "decode_libtiffpic" path = "tests/decode_libtiffpic.rs" diff --git a/benches/decode.rs b/benches/decode.rs new file mode 100644 index 0000000..51f13f3 --- /dev/null +++ b/benches/decode.rs @@ -0,0 +1,40 @@ +extern crate criterion; +extern crate tiff; + +use criterion::{black_box, Criterion, Throughput}; +use tiff::decoder::Decoder; + +fn decode_image(data: &[u8]) { + let image = std::io::Cursor::new(data); + let mut reader = Decoder::open(black_box(image)).unwrap(); + reader.next_image().unwrap(); + reader.read_image().unwrap(); +} + +fn main() { + let mut c = Criterion::default().configure_from_args(); + + // Check if large bench images exist + let bench_dir = std::path::Path::new("/tmp/bench-tiff"); + if !bench_dir.is_dir() { + eprintln!("Skipping large image benchmarks: /tmp/bench-tiff/ not found"); + eprintln!("Generate with: cc -O2 -o /tmp/gen_bench_tiff /tmp/gen_bench_tiff.c -ltiff -lm && /tmp/gen_bench_tiff"); + return; + } + + let mut group = c.benchmark_group("decode-1024x1024"); + group.sample_size(30); + + for depth in [3, 5, 7, 8, 10, 12, 14, 16, 24] { + let path = bench_dir.join(format!("bench-1c-{depth}b.tiff")); + if !path.exists() { + continue; + } + let data = std::fs::read(&path).unwrap(); + group + .throughput(Throughput::Bytes(data.len() as u64)) + .bench_function(format!("{depth}b"), |b| b.iter(|| decode_image(&data))); + } + + group.finish(); +}