[librsvg: 3/12] Add benchmarks for operations on surface_utils::Pixel




commit 01388f84476ed306907653c0852c648ab35c437c
Author: Sven Neumann <sven svenfoo org>
Date:   Mon Oct 12 12:19:11 2020 +0200

    Add benchmarks for operations on surface_utils::Pixel

 rsvg_internals/Cargo.toml           |  4 +++
 rsvg_internals/benches/pixel_ops.rs | 57 +++++++++++++++++++++++++++++++++++++
 2 files changed, 61 insertions(+)
---
diff --git a/rsvg_internals/Cargo.toml b/rsvg_internals/Cargo.toml
index f049391b..f46ee272 100644
--- a/rsvg_internals/Cargo.toml
+++ b/rsvg_internals/Cargo.toml
@@ -74,6 +74,10 @@ harness = false
 name = "pixel_iterators"
 harness = false
 
+[[bench]]
+name = "pixel_ops"
+harness = false
+
 [[bench]]
 name = "srgb"
 harness = false
diff --git a/rsvg_internals/benches/pixel_ops.rs b/rsvg_internals/benches/pixel_ops.rs
new file mode 100644
index 00000000..e4cee1e6
--- /dev/null
+++ b/rsvg_internals/benches/pixel_ops.rs
@@ -0,0 +1,57 @@
+use criterion::{black_box, criterion_group, criterion_main, Criterion};
+
+use rsvg_internals::surface_utils::Pixel;
+
+const OTHER: Pixel = Pixel {
+    r: 0x10,
+    g: 0x20,
+    b: 0x30,
+    a: 0x40,
+};
+const N: usize = 1024;
+
+fn make_pixels(n: usize) -> Vec<Pixel> {
+    (0..n)
+        .map(|i| Pixel {
+            r: (i / 2) as u8,
+            g: (i / 3) as u8,
+            b: (i / 4) as u8,
+            a: i as u8,
+        })
+        .collect()
+}
+
+fn bench_op<F>(pixels: &[Pixel], op: F)
+where
+    F: Fn(&Pixel) -> Pixel,
+{
+    let result: Vec<Pixel> = pixels.iter().map(op).collect();
+    black_box(result);
+}
+
+fn bench_pixel_ops(c: &mut Criterion) {
+    c.bench_function("pixel_diff", |b| {
+        let pixels = black_box(make_pixels(N));
+        let other = black_box(OTHER);
+        b.iter(|| bench_op(&pixels, |pixel| pixel.diff(&other)))
+    });
+
+    c.bench_function("pixel_to_mask", |b| {
+        let pixels = black_box(make_pixels(N));
+        let opacity = black_box(0x70);
+        b.iter(|| bench_op(&pixels, |pixel| pixel.to_mask(opacity)))
+    });
+
+    c.bench_function("pixel_premultiply", |b| {
+        let pixels = black_box(make_pixels(N));
+        b.iter(|| bench_op(&pixels, |pixel| pixel.premultiply()))
+    });
+
+    c.bench_function("pixel_unpremultiply", |b| {
+        let pixels = black_box(make_pixels(N));
+        b.iter(|| bench_op(&pixels, |pixel| pixel.unpremultiply()))
+    });
+}
+
+criterion_group!(benches, bench_pixel_ops);
+criterion_main!(benches);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]