png is a bitmap format? who knew!
Diffstat (limited to 'benches/bench.rs')
-rw-r--r--benches/bench.rs84
1 files changed, 84 insertions, 0 deletions
diff --git a/benches/bench.rs b/benches/bench.rs
new file mode 100644
index 0000000..decbccf
--- /dev/null
+++ b/benches/bench.rs
@@ -0,0 +1,84 @@
+#![feature(test, array_chunks)]
+extern crate test;
+const W: u32 = 2144;
+const H: u32 = 1424;
+use atools::prelude::*;
+
+fn rgba() -> &'static [u8] {
+ Box::leak(std::hint::black_box(
+ rgb()
+ .array_chunks::<3>()
+ .flat_map(|&x| x.join(255))
+ .collect::<Box<_>>(),
+ ))
+}
+
+fn rgb() -> &'static [u8] {
+ std::hint::black_box(include_bytes!("cat"))
+}
+
+fn ya() -> &'static [u8] {
+ Box::leak(std::hint::black_box(
+ y().iter().flat_map(|&x| x.join(255)).collect::<Box<_>>(),
+ ))
+}
+
+fn y() -> &'static [u8] {
+ Box::leak(std::hint::black_box(
+ include_bytes!("cat")
+ .array_chunks::<3>()
+ .map(|&[r, g, b]| ((2126 * r as u32 + 7152 * g as u32 + 722 * b as u32) / 10000) as u8)
+ .collect::<Box<_>>(),
+ ))
+}
+
+macro_rules! m {
+ ($f:ident, $c:ident, $c2:ident, me $me:ident them $them: ident) => {
+ #[bench]
+ fn $me(b: &mut test::Bencher) {
+ let mut v = Vec::with_capacity(10 << 20);
+ let dat = $f();
+ // pngenc::encode(
+ // pngenc::Color::$c,
+ // (W, H),
+ // dat,
+ // &mut std::fs::File::create(stringify!($f)).unwrap(),
+ // )
+ // .unwrap();
+ b.bytes = dat.len() as _;
+ b.iter(|| {
+ v.clear();
+ pngenc::ode(pngenc::Color::$c, (W, H), dat, &mut v).unwrap();
+ std::hint::black_box(&v);
+ })
+ }
+
+ #[bench]
+ fn $them(b: &mut test::Bencher) {
+ let mut v = Vec::with_capacity(10 << 20);
+ let dat = $f();
+ b.bytes = dat.len() as _;
+ b.iter(|| {
+ v.clear();
+ let mut enc = png::Encoder::new(&mut v, W, H);
+ enc.set_color(png::ColorType::$c2);
+ enc.set_depth(png::BitDepth::Eight);
+ enc.set_source_gamma(png::ScaledFloat::new(1.0 / 2.2));
+ enc.set_source_chromaticities(png::SourceChromaticities::new(
+ (0.31270, 0.32900),
+ (0.64000, 0.33000),
+ (0.30000, 0.60000),
+ (0.15000, 0.06000),
+ ));
+ let mut writer = enc.write_header().unwrap();
+ writer.write_image_data(dat).unwrap();
+ drop(writer);
+ std::hint::black_box(&v);
+ })
+ }
+ };
+}
+m![rgba, RGBA, Rgba, me pngenc_rgba them png_rgba];
+m![rgb, RGB, Rgb, me pngenc_rgb them png_rgb];
+m![ya, YA, GrayscaleAlpha, me pngenc_ya them png_ya];
+m![y, Y, Grayscale, me pngenc_y them png_y];