diff options
Diffstat (limited to 'benches')
| -rw-r--r-- | benches/all_samples.rs | 255 | ||||
| -rw-r--r-- | benches/random.rs | 44 | ||||
| -rw-r--r-- | benches/shift_kernels.rs | 173 |
3 files changed, 472 insertions, 0 deletions
diff --git a/benches/all_samples.rs b/benches/all_samples.rs new file mode 100644 index 0000000..7a8b6b8 --- /dev/null +++ b/benches/all_samples.rs @@ -0,0 +1,255 @@ +use divan::{Bencher, black_box}; +use image::ImageReader; + +const LIST_OF_SAMPLES: [&str; 4] = [ + "samples/david.png", + "samples/karel_käos.jpg", + "samples/jane.jpg", + "samples/diderot_111.png", +]; + +fn main() { + // Run `add` benchmark: + divan::main(); +} + +#[divan::bench(args = LIST_OF_SAMPLES)] +fn test_burkes(bencher: Bencher, img: &str) { + let sample_img = ImageReader::open(img) + .unwrap() + .decode() + .unwrap() + .into_rgb8(); + + bencher.bench_local(|| { + let mut img = black_box(sample_img.clone()); + dither::dither(&mut img, dither::kernel::BURKES_KERNEL.to_vec()) + }); +} + +#[divan::bench(args = LIST_OF_SAMPLES)] +fn test_atkinson_base(bencher: Bencher, img: &str) { + let sample_img = ImageReader::open(img) + .unwrap() + .decode() + .unwrap() + .into_rgb8(); + + bencher.bench_local(|| { + let mut img = black_box(sample_img.clone()); + dither::dither_atkinson_base(&mut img) + }); +} +#[divan::bench(args = LIST_OF_SAMPLES)] +fn test_atkinson(bencher: Bencher, img: &str) { + let sample_img = ImageReader::open(img) + .unwrap() + .decode() + .unwrap() + .into_rgb8(); + + bencher.bench_local(|| { + let mut img = black_box(sample_img.clone()); + dither::dither(&mut img, dither::kernel::ATKINSON_KERNEL.to_vec()) + }); +} +#[divan::bench(args = LIST_OF_SAMPLES)] +fn test_atkinson_ref(bencher: Bencher, img: &str) { + let sample_img = ImageReader::open(img) + .unwrap() + .decode() + .unwrap() + .into_rgb8(); + let kernel = dither::kernel::ATKINSON_KERNEL.to_vec(); + + bencher.bench_local(|| { + let mut img = black_box(sample_img.clone()); + dither::dither_ref(&mut img, &kernel) + }); +} + +#[divan::bench(args = LIST_OF_SAMPLES)] +fn test_atkinson_int(bencher: Bencher, img: &str) { + let sample_img = ImageReader::open(img) + .unwrap() + .decode() + .unwrap() + .into_rgb8(); + + bencher.bench_local(|| { + let mut img = black_box(sample_img.clone()); + let kernel = dither::kernel::ATKINSON_KERNEL_INTEGER.to_vec(); + dither::dither_shift( + &mut img, + dither::kernel::KernelShift { + kernel, + bit_shift: dither::kernel::ATKINSON_KERNEL_BIT_SHIFT, + }, + ); + }); +} + +#[divan::bench(args = LIST_OF_SAMPLES)] +fn test_floyd_steinberg(bencher: Bencher, img: &str) { + let sample_img = ImageReader::open(img) + .unwrap() + .decode() + .unwrap() + .into_rgb8(); + let kernel = dither::kernel::FLOYD_STEINBERG_KERNEL.to_vec(); + + bencher.bench_local(|| { + let mut img = black_box(sample_img.clone()); + dither::dither_ref(&mut img, &kernel) + }); +} + +#[divan::bench(args = LIST_OF_SAMPLES)] +fn test_fedoseev(bencher: Bencher, img: &str) { + let sample_img = ImageReader::open(img) + .unwrap() + .decode() + .unwrap() + .into_rgb8(); + let kernel = dither::kernel::FEDOSEEV_KERNEL.to_vec(); + + bencher.bench_local(|| { + let mut img = black_box(sample_img.clone()); + dither::dither_ref(&mut img, &kernel) + }); +} + +#[divan::bench(args = LIST_OF_SAMPLES)] +fn test_fedoseev2(bencher: Bencher, img: &str) { + let sample_img = ImageReader::open(img) + .unwrap() + .decode() + .unwrap() + .into_rgb8(); + let kernel = dither::kernel::FEDOSEEV2_KERNEL.to_vec(); + + bencher.bench_local(|| { + let mut img = black_box(sample_img.clone()); + dither::dither_ref(&mut img, &kernel) + }); +} + +#[divan::bench(args = LIST_OF_SAMPLES)] +fn test_fedoseev3(bencher: Bencher, img: &str) { + let sample_img = ImageReader::open(img) + .unwrap() + .decode() + .unwrap() + .into_rgb8(); + let kernel = dither::kernel::FEDOSEEV3_KERNEL.to_vec(); + + bencher.bench_local(|| { + let mut img = black_box(sample_img.clone()); + dither::dither_ref(&mut img, &kernel) + }); +} + +#[divan::bench(args = LIST_OF_SAMPLES)] +fn test_fedoseev4(bencher: Bencher, img: &str) { + let sample_img = ImageReader::open(img) + .unwrap() + .decode() + .unwrap() + .into_rgb8(); + let kernel = dither::kernel::FEDOSEEV4_KERNEL.to_vec(); + + bencher.bench_local(|| { + let mut img = black_box(sample_img.clone()); + dither::dither_ref(&mut img, &kernel) + }); +} + +#[divan::bench(args = LIST_OF_SAMPLES)] +fn test_wong_allebach(bencher: Bencher, img: &str) { + let sample_img = ImageReader::open(img) + .unwrap() + .decode() + .unwrap() + .into_rgb8(); + let kernel = dither::kernel::WONG_ALLEBACH_KERNEL.to_vec(); + + bencher.bench_local(|| { + let mut img = black_box(sample_img.clone()); + dither::dither_ref(&mut img, &kernel) + }); +} + +#[divan::bench(args = LIST_OF_SAMPLES)] +fn test_jarvis_judice_ninke(bencher: Bencher, img: &str) { + let sample_img = ImageReader::open(img) + .unwrap() + .decode() + .unwrap() + .into_rgb8(); + let kernel = dither::kernel::JARVIS_JUDICE_NINKE_KERNEL.to_vec(); + + bencher.bench_local(|| { + let mut img = black_box(sample_img.clone()); + dither::dither_ref(&mut img, &kernel) + }); +} + +#[divan::bench(args = LIST_OF_SAMPLES)] +fn test_stucki(bencher: Bencher, img: &str) { + let sample_img = ImageReader::open(img) + .unwrap() + .decode() + .unwrap() + .into_rgb8(); + let kernel = dither::kernel::STUCKI_KERNEL.to_vec(); + + bencher.bench_local(|| { + let mut img = black_box(sample_img.clone()); + dither::dither_ref(&mut img, &kernel) + }); +} + +#[divan::bench(args = LIST_OF_SAMPLES)] +fn test_sierra(bencher: Bencher, img: &str) { + let sample_img = ImageReader::open(img) + .unwrap() + .decode() + .unwrap() + .into_rgb8(); + let kernel = dither::kernel::SIERRA3_KERNEL.to_vec(); + + bencher.bench_local(|| { + let mut img = black_box(sample_img.clone()); + dither::dither_ref(&mut img, &kernel) + }); +} + +#[divan::bench(args = LIST_OF_SAMPLES)] +fn test_sierra_two_rows(bencher: Bencher, img: &str) { + let sample_img = ImageReader::open(img) + .unwrap() + .decode() + .unwrap() + .into_rgb8(); + let kernel = dither::kernel::SIERRA2_KERNEL.to_vec(); + + bencher.bench_local(|| { + let mut img = black_box(sample_img.clone()); + dither::dither_ref(&mut img, &kernel) + }); +} + +#[divan::bench(args = LIST_OF_SAMPLES)] +fn test_sierra_lite(bencher: Bencher, img: &str) { + let sample_img = ImageReader::open(img) + .unwrap() + .decode() + .unwrap() + .into_rgb8(); + let kernel = dither::kernel::SIERRA_LITE_KERNEL.to_vec(); + + bencher.bench_local(|| { + let mut img = black_box(sample_img.clone()); + dither::dither_ref(&mut img, &kernel) + }); +} diff --git a/benches/random.rs b/benches/random.rs new file mode 100644 index 0000000..a7446c9 --- /dev/null +++ b/benches/random.rs @@ -0,0 +1,44 @@ +use criterion::{Criterion, criterion_group, criterion_main}; +use image::ImageReader; + +const LIST_OF_SAMPLES: [&str; 7] = [ + "samples/david.png", + "samples/david2.jpg", + "samples/us.png", + "samples/diderot_111.png", + "samples/jane.jpg", + "samples/jane2.webp", + "samples/karel_käos.jpg", +]; + +pub fn bench_random(c: &mut Criterion) { + let img = ImageReader::open(LIST_OF_SAMPLES[1]) + .unwrap() + .decode() + .unwrap() + .into_rgb8(); + + c.bench_function("dither random", |b| { + b.iter(|| { + let mut img = img.clone(); + dither::dither_random(&mut img) + }) + }); +} +pub fn bench_random_color(c: &mut Criterion) { + let img = ImageReader::open(LIST_OF_SAMPLES[1]) + .unwrap() + .decode() + .unwrap() + .into_rgb8(); + + c.bench_function("dither random", |b| { + b.iter(|| { + let mut img = img.clone(); + dither::dither_random_color(&mut img) + }) + }); +} + +criterion_group!(random, bench_random, bench_random_color); +criterion_main!(random); diff --git a/benches/shift_kernels.rs b/benches/shift_kernels.rs new file mode 100644 index 0000000..265bb20 --- /dev/null +++ b/benches/shift_kernels.rs @@ -0,0 +1,173 @@ +use criterion::{Criterion, criterion_group, criterion_main}; +use dither::kernel; +use image::ImageReader; + +const LIST_OF_SAMPLES: [&str; 7] = [ + "samples/david.png", + "samples/david2.jpg", + "samples/us.png", + "samples/diderot_111.png", + "samples/jane.jpg", + "samples/jane2.webp", + "samples/karel_käos.jpg", +]; + +pub fn bench_integer_variation(c: &mut Criterion) { + let img = ImageReader::open(LIST_OF_SAMPLES[0]) + .unwrap() + .decode() + .unwrap() + .into_rgb8(); + + c.bench_function("dither atkinson integer only", |b| { + b.iter(|| { + let mut img = img.clone(); + dither::dither_shift( + &mut img, + kernel::KernelShift { + kernel: dither::kernel::ATKINSON_KERNEL_INTEGER.to_vec(), + bit_shift: kernel::ATKINSON_KERNEL_BIT_SHIFT, + }, + ) + }) + }); + c.bench_function("dither atkinson", |b| { + b.iter(|| { + let mut img = img.clone(); + dither::dither(&mut img, dither::kernel::ATKINSON_KERNEL.to_vec()) + }) + }); + /* + * This bench verify that the image loading isn't the only thing we benchmark. + * Indeed it isn't. + * + * Check it with: + * $ cargo bench --features check-bench + */ + + #[cfg(feature = "check-bench")] + c.bench_function("image loading", |b| { + b.iter(|| { + let mut img = img.clone(); + std::hint::black_box(&mut img); + }) + }); + #[cfg(feature = "check-bench")] + c.bench_function("image loading no black box", |b| { + b.iter(|| { + let _ = img.clone(); + }) + }); + #[cfg(feature = "check-bench")] + c.bench_function("image loading only black box", |b| { + b.iter(|| { + std::hint::black_box(11); + }) + }); +} +pub fn bench_dithers_on_david(c: &mut Criterion) { + let sample_img = ImageReader::open(LIST_OF_SAMPLES[0]) + .unwrap() + .decode() + .unwrap() + .into_rgb8(); + + let algos: [(&str, dither::DitherFn); 14] = [ + ("kernel_atkinson", |img| { + dither::dither(img, kernel::ATKINSON_KERNEL.to_vec()) + }), + ("kernel_atkinson_integer", |img| { + dither::dither_shift( + img, + dither::kernel::KernelShift { + kernel: kernel::ATKINSON_KERNEL_INTEGER.to_vec(), + bit_shift: kernel::ATKINSON_KERNEL_BIT_SHIFT, + }, + ) + }), + ("kernel_floyd_steinberg", |img| { + dither::dither(img, dither::kernel::FLOYD_STEINBERG_KERNEL.to_vec()) + }), + ("kernel_fedoseev", |img| { + dither::dither(img, dither::kernel::FEDOSEEV_KERNEL.to_vec()) + }), + ("kernel_fedoseev2", |img| { + dither::dither(img, dither::kernel::FEDOSEEV2_KERNEL.to_vec()) + }), + ("kernel_fedoseev3", |img| { + dither::dither(img, dither::kernel::FEDOSEEV3_KERNEL.to_vec()) + }), + ("kernel_fedoseev4", |img| { + dither::dither(img, dither::kernel::FEDOSEEV4_KERNEL.to_vec()) + }), + ("kernel_wong_allebach", |img| { + dither::dither(img, dither::kernel::WONG_ALLEBACH_KERNEL.to_vec()) + }), + ("kernel_jarvis_judice_ninke", |img| { + dither::dither(img, dither::kernel::JARVIS_JUDICE_NINKE_KERNEL.to_vec()) + }), + ("kernel_stucki", |img| { + dither::dither(img, dither::kernel::STUCKI_KERNEL.to_vec()) + }), + ("kernel_burkes", |img| { + dither::dither(img, dither::kernel::BURKES_KERNEL.to_vec()) + }), + ("kernel_sierra3", |img| { + dither::dither(img, dither::kernel::SIERRA3_KERNEL.to_vec()) + }), + ("kernel_sierra2", |img| { + dither::dither(img, dither::kernel::SIERRA2_KERNEL.to_vec()) + }), + ("kernel_sierra-lite", |img| { + dither::dither(img, dither::kernel::SIERRA_LITE_KERNEL.to_vec()) + }), + /* + ("kernel_hallucination_prewitt", |img| { + dither::dither(img, dither::kernel::PREWITT_KERNEL.to_vec()) + }), + ("kernel_hallucination_roberts", |img| { + dither::dither(img, dither::kernel::ROBERTS_KERNEL.to_vec()) + }), + ("kernel_hallucination_sobel", |img| { + dither::dither(img, dither::kernel::SOBEL_KERNEL.to_vec()) + }), + */ + ]; + + let mut group = c.benchmark_group("every dithering algorithm on david"); + + for algo in &algos { + group.bench_function(&format!("{} on david", algo.0), |b| { + b.iter(|| { + let mut img = sample_img.clone(); + algo.1(&mut img) + }) + }); + } +} +pub fn bench_stucki_all_samples(c: &mut Criterion) { + let mut group = c.benchmark_group("stucki on all samples"); + + for sample in LIST_OF_SAMPLES { + let sample_img = ImageReader::open(sample) + .unwrap() + .decode() + .unwrap() + .into_rgb8(); + + group.bench_function(&format!("Stucki on {}", sample), |b| { + b.iter(|| { + let mut img = sample_img.clone(); + dither::dither(&mut img, kernel::STUCKI_KERNEL.to_vec()) + }) + }); + } + + group.finish(); +} + +criterion_group!(benche_int, bench_integer_variation); +criterion_group!(benche_all_samples, bench_stucki_all_samples); +criterion_group!(benche_all_kernels, bench_dithers_on_david); + +criterion_main!(benche_int, benche_all_samples, benche_all_kernels); |