Skip to content

Commit d1f8172

Browse files
committed
Add three benchmarks to the crate
Test decoding of single-pass and progressive JPEGs as well as metadata extraction. Add "cargo bench" to the CI, and cache previous results between runs so that performance regressions can be easily spotted. The photograph of the Eiffel Tower was taken by me; no rights reserved.
1 parent 7100e83 commit d1f8172

File tree

6 files changed

+44
-0
lines changed

6 files changed

+44
-0
lines changed

.travis.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,6 @@ env:
1313
script:
1414
- cargo build --verbose --no-default-features --features "$FEATURES"
1515
- cargo test --verbose --no-default-features --features "$FEATURES"
16+
- cargo bench --verbose --no-default-features --features "$FEATURES"
17+
18+
cache: cargo

Cargo.toml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@ rayon = { version = "1.0", optional = true }
1717
[dev-dependencies]
1818
png = "0.14"
1919
walkdir = "2.0"
20+
criterion = "0.2"
21+
22+
[[bench]]
23+
name = "decoding_benchmark"
24+
harness = false
2025

2126
[features]
2227
default = ["rayon"]

appveyor.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,4 @@ build: false
1717
test_script:
1818
- cargo build --verbose
1919
- cargo test --verbose
20+
- cargo bench --verbose

benches/decoding_benchmark.rs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
extern crate criterion;
2+
extern crate jpeg_decoder;
3+
4+
5+
use criterion::{black_box, Criterion, criterion_group, criterion_main};
6+
7+
use jpeg_decoder as jpeg;
8+
use jpeg_decoder::ImageInfo;
9+
10+
fn read_image(image: &[u8]) -> Vec<u8> {
11+
jpeg::Decoder::new(black_box(image)).decode().unwrap()
12+
}
13+
14+
fn read_metadata(image: &[u8]) -> ImageInfo {
15+
let mut decoder = jpeg::Decoder::new(black_box(image));
16+
decoder.read_info().unwrap();
17+
decoder.info().unwrap()
18+
}
19+
20+
pub fn criterion_benchmark(c: &mut Criterion) {
21+
c.bench_function("decode a 512x512 JPEG", |b| b.iter(|| {
22+
read_image(include_bytes!("tower.jpg"))
23+
}));
24+
25+
c.bench_function("decode a 512x512 progressive JPEG", |b| b.iter(|| {
26+
read_image(include_bytes!("tower_progressive.jpg"))
27+
}));
28+
29+
c.bench_function("extract metadata from an image", |b| b.iter(|| {
30+
read_metadata(include_bytes!("tower.jpg"))
31+
}));
32+
}
33+
34+
criterion_group!(benches, criterion_benchmark);
35+
criterion_main!(benches);

benches/tower.jpg

69 KB
Loading

benches/tower_progressive.jpg

66.6 KB
Loading

0 commit comments

Comments
 (0)