summaryrefslogtreecommitdiff
path: root/benches
diff options
context:
space:
mode:
Diffstat (limited to 'benches')
-rw-r--r--benches/all_samples.rs255
-rw-r--r--benches/random.rs44
-rw-r--r--benches/shift_kernels.rs173
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);