summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpommicket <pommicket@gmail.com>2023-09-04 22:40:18 -0400
committerpommicket <pommicket@gmail.com>2023-09-04 22:46:55 -0400
commit827122e165922c4010096c8d9ad32913ae06ab9e (patch)
treef1a6695c52bfdcfe2f1c6aac53a307aff061fcdc
parent021e276598b44d31fc5b90ea145f3b80e97d6e22 (diff)
benchmark
-rw-r--r--Cargo.toml7
-rw-r--r--benches/bench.rs58
-rw-r--r--benches/large.pngbin0 -> 7655145 bytes
-rw-r--r--benches/small.pngbin0 -> 233 bytes
-rwxr-xr-xpre-commit2
-rw-r--r--src/lib.rs2
-rwxr-xr-xtest-all.sh8
7 files changed, 69 insertions, 8 deletions
diff --git a/Cargo.toml b/Cargo.toml
index 37e7c99..fe73293 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -3,12 +3,15 @@ name = "tiny-png"
version = "0.1.0"
edition = "2021"
-[dependencies]
-
[dev-dependencies]
+criterion = { version = "0.5.1", features = ["html_reports"] }
png = "0.17.10"
[features]
default = ["std"]
std = []
adler = []
+
+[[bench]]
+name = "bench"
+harness = false
diff --git a/benches/bench.rs b/benches/bench.rs
new file mode 100644
index 0000000..a8c13ba
--- /dev/null
+++ b/benches/bench.rs
@@ -0,0 +1,58 @@
+use criterion::{criterion_group, criterion_main, Criterion};
+use std::hint::black_box;
+
+fn run_benches(c: &mut Criterion) {
+ let large_image = black_box(std::fs::read("benches/large.png").unwrap());
+ let small_image = black_box(std::fs::read("benches/small.png").unwrap());
+
+ let mut group = c.benchmark_group("large-image");
+ group.sample_size(50);
+
+ group.bench_function("tiny-png", |b| {
+ b.iter(|| {
+ let mut png = &large_image[..];
+ let header = tiny_png::read_png_header(&mut png).unwrap();
+ let mut buf = vec![0; header.required_bytes()];
+ let data = tiny_png::read_png(&mut png, Some(&header), &mut buf).unwrap();
+ std::hint::black_box(data);
+ })
+ });
+
+ group.bench_function("png", |b| {
+ b.iter(|| {
+ let png = &large_image[..];
+ let decoder = png::Decoder::new(png);
+ let mut reader = decoder.read_info().unwrap();
+ let mut png_buf = vec![0; reader.output_buffer_size()];
+ reader.next_frame(&mut png_buf).unwrap();
+ std::hint::black_box(png_buf);
+ })
+ });
+ group.finish();
+
+ let mut group = c.benchmark_group("small-image");
+ group.sample_size(1000);
+ group.bench_function("tiny-png", |b| {
+ b.iter(|| {
+ let mut png = &small_image[..];
+ let header = tiny_png::read_png_header(&mut png).unwrap();
+ let mut buf = vec![0; header.required_bytes()];
+ let data = tiny_png::read_png(&mut png, Some(&header), &mut buf).unwrap();
+ std::hint::black_box(data);
+ })
+ });
+ group.bench_function("png", |b| {
+ b.iter(|| {
+ let png = &small_image[..];
+ let decoder = png::Decoder::new(png);
+ let mut reader = decoder.read_info().unwrap();
+ let mut png_buf = vec![0; reader.output_buffer_size()];
+ reader.next_frame(&mut png_buf).unwrap();
+ std::hint::black_box(png_buf);
+ })
+ });
+ group.finish();
+}
+
+criterion_group!(benches, run_benches);
+criterion_main!(benches);
diff --git a/benches/large.png b/benches/large.png
new file mode 100644
index 0000000..f0344e5
--- /dev/null
+++ b/benches/large.png
Binary files differ
diff --git a/benches/small.png b/benches/small.png
new file mode 100644
index 0000000..47226a2
--- /dev/null
+++ b/benches/small.png
Binary files differ
diff --git a/pre-commit b/pre-commit
index 5055d4b..d086491 100755
--- a/pre-commit
+++ b/pre-commit
@@ -3,4 +3,4 @@
cd $(git rev-parse --show-toplevel)
cargo fmt || exit 1
cargo clippy -- -D warnings || exit 1
-git add -u src
+git add -u src benches test examples
diff --git a/src/lib.rs b/src/lib.rs
index 750a1f3..fa3bab9 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -506,7 +506,7 @@ impl<'a> DecompressedDataWriter<'a> {
const HUFFMAN_MAX_CODES: usize = 286;
const HUFFMAN_MAX_BITS: u8 = 15;
-const HUFFMAN_MAIN_TABLE_BITS: u8 = 11;
+const HUFFMAN_MAIN_TABLE_BITS: u8 = 10;
const HUFFMAN_MAIN_TABLE_SIZE: usize = 1 << HUFFMAN_MAIN_TABLE_BITS;
const HUFFMAN_SUBTABLE_SIZE: usize = 1 << (HUFFMAN_MAX_BITS - HUFFMAN_MAIN_TABLE_BITS);
#[derive(Debug)]
diff --git a/test-all.sh b/test-all.sh
index c15341a..cb7f19a 100755
--- a/test-all.sh
+++ b/test-all.sh
@@ -2,8 +2,8 @@
# test all feature sets
for mode in '' '--release'; do
- cargo t $mode
- cargo t $mode --no-default-features
- cargo t $mode --features adler
- cargo t $mode --no-default-features --features adler
+ cargo t $mode || exit 1
+ cargo t $mode --no-default-features || exit 1
+ cargo t $mode --features adler || exit 1
+ cargo t $mode --no-default-features --features adler || exit 1
done