diff --git a/Cargo.toml b/Cargo.toml index 36c7a34..84fc202 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,3 +21,10 @@ lzw = "0.10" [dependencies.miniz_oxide] version = "0.4.1" features = ["no_extern_crate_alloc"] + +[dev-dependencies] +criterion = "0.3.1" + +[[bench]] +name = "lzw" +harness = false diff --git a/benches/lzw.rs b/benches/lzw.rs new file mode 100644 index 0000000..96e3d70 --- /dev/null +++ b/benches/lzw.rs @@ -0,0 +1,72 @@ +extern crate criterion; +extern crate tiff; + +use criterion::{black_box, BenchmarkId, BenchmarkGroup, Criterion, Throughput, measurement::Measurement}; +use tiff::decoder::Decoder; + +fn read_image(image: &[u8]) { + let image = std::io::Cursor::new(image); + let decoder = Decoder::new(black_box(image)); + let mut reader = decoder.unwrap(); + + while { + reader.read_image().unwrap(); + reader.more_images() + } {} +} + +fn main() { + struct BenchDef { + data: &'static [u8], + id: &'static str, + sample_size: usize, + } + + fn run_bench_def(group: &mut BenchmarkGroup, def: BenchDef) { + group + .sample_size(def.sample_size) + .throughput(Throughput::Bytes(def.data.len() as u64)) + .bench_with_input( + BenchmarkId::new(def.id, def.data.len()), + def.data, + |b, input| { + b.iter(|| read_image(input)) + } + ); + }; + + let mut c = Criterion::default().configure_from_args(); + let mut group = c.benchmark_group("tiff-lzw"); + + /* + run_bench_def(&mut group, BenchDef { + data: include_bytes!(concat!(env!("CARGO_MANIFEST_DIR"), "/tests/images/quad-lzw-compat.tiff")), + id: "quad-lzw.tif", + sample_size: 500, + }); + */ + + run_bench_def(&mut group, BenchDef { + data: include_bytes!(concat!(env!("CARGO_MANIFEST_DIR"), "/tests/images/issue_69_lzw.tiff")), + id: "issue-69-lzw.tif", + sample_size: 500, + }); + + run_bench_def(&mut group, BenchDef { + data: include_bytes!(concat!(env!("CARGO_MANIFEST_DIR"), "/tests/benches/kodim02-lzw.tif")), + id: "kodim02-lzw.tif", + sample_size: 20, + }); + + run_bench_def(&mut group, BenchDef { + data: include_bytes!(concat!(env!("CARGO_MANIFEST_DIR"), "/tests/benches/kodim07-lzw.tif")), + id: "kodim07-lzw.tif", + sample_size: 20, + }); + + run_bench_def(&mut group, BenchDef { + data: include_bytes!(concat!(env!("CARGO_MANIFEST_DIR"), "/tests/benches/Transparency-lzw.tif")), + id: "Transparency-lzw.tif", + sample_size: 20, + }); +} diff --git a/tests/benches/README.md b/tests/benches/README.md new file mode 100644 index 0000000..616292c --- /dev/null +++ b/tests/benches/README.md @@ -0,0 +1,4 @@ +Copyrights: + +kodim*.png: Eastman Kodak Company, released for unrestricted use +Transparency.png: Public Domain, according to Wikimedia diff --git a/tests/benches/Transparency-lzw.tif b/tests/benches/Transparency-lzw.tif new file mode 100644 index 0000000..a7a26a9 Binary files /dev/null and b/tests/benches/Transparency-lzw.tif differ diff --git a/tests/benches/kodim02-lzw.tif b/tests/benches/kodim02-lzw.tif new file mode 100644 index 0000000..a1aabfb Binary files /dev/null and b/tests/benches/kodim02-lzw.tif differ diff --git a/tests/benches/kodim07-lzw.tif b/tests/benches/kodim07-lzw.tif new file mode 100644 index 0000000..f8d543d Binary files /dev/null and b/tests/benches/kodim07-lzw.tif differ