#![cfg(feature = "image")]
use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion};
use dotmax::image::{load_from_bytes, resize_to_dimensions, resize_to_terminal};
use image::{DynamicImage, RgbaImage};
use std::hint::black_box;
fn create_test_image(width: u32, height: u32) -> DynamicImage {
let img = RgbaImage::new(width, height);
DynamicImage::ImageRgba8(img)
}
fn bench_resize_typical_terminal(c: &mut Criterion) {
let img = create_test_image(800, 600);
c.bench_function("resize_800x600_to_80x24_terminal", |b| {
b.iter(|| {
black_box(resize_to_terminal(&img, 80, 24).unwrap());
});
});
}
fn bench_resize_large_terminal(c: &mut Criterion) {
let img = create_test_image(1920, 1080);
c.bench_function("resize_1920x1080_to_200x50_terminal", |b| {
b.iter(|| {
black_box(resize_to_terminal(&img, 200, 50).unwrap());
});
});
}
fn bench_resize_small_image(c: &mut Criterion) {
let img = create_test_image(100, 100);
c.bench_function("resize_100x100_to_80x24_terminal", |b| {
b.iter(|| {
black_box(resize_to_terminal(&img, 80, 24).unwrap());
});
});
}
fn bench_resize_performance_target_validation(c: &mut Criterion) {
let mut group = c.benchmark_group("resize_performance_targets");
let test_cases = [
(100, 100, 2), (400, 300, 5), (800, 600, 10), (1024, 768, 12), (1920, 1080, 15), ];
for (width, height, _expected_max) in test_cases {
let img = create_test_image(width, height);
let id = BenchmarkId::new("resize_to_80x24", format!("{}x{}", width, height));
group.bench_with_input(id, &img, |b, img| {
b.iter(|| {
black_box(resize_to_terminal(img, 80, 24).unwrap());
});
});
}
group.finish();
}
fn bench_resize_filter_comparison(c: &mut Criterion) {
use image::imageops::{resize, FilterType};
let img = create_test_image(800, 600);
let target_width = 160;
let target_height = 96;
let mut group = c.benchmark_group("resize_filter_comparison");
group.bench_function("lanczos3", |b| {
b.iter(|| {
black_box(resize(
&img,
target_width,
target_height,
FilterType::Lanczos3,
));
});
});
group.bench_function("triangle", |b| {
b.iter(|| {
black_box(resize(
&img,
target_width,
target_height,
FilterType::Triangle,
));
});
});
group.bench_function("nearest", |b| {
b.iter(|| {
black_box(resize(
&img,
target_width,
target_height,
FilterType::Nearest,
));
});
});
group.finish();
}
fn bench_full_resize_pipeline(c: &mut Criterion) {
let img = create_test_image(800, 600);
c.bench_function("resize_pipeline_preserve_aspect", |b| {
b.iter(|| {
black_box(resize_to_dimensions(&img, 200, 100, true).unwrap());
});
});
c.bench_function("resize_pipeline_stretch", |b| {
b.iter(|| {
black_box(resize_to_dimensions(&img, 200, 100, false).unwrap());
});
});
}
#[cfg(feature = "image")]
fn bench_load_and_resize_pipeline(c: &mut Criterion) {
let path = std::path::Path::new("tests/fixtures/images/sample.png");
let bytes = std::fs::read(path).expect("Failed to read sample.png");
c.bench_function("load_and_resize_pipeline", |b| {
b.iter(|| {
let img = load_from_bytes(&bytes).unwrap();
black_box(resize_to_terminal(&img, 80, 24).unwrap());
});
});
}
criterion_group!(
benches,
bench_resize_typical_terminal,
bench_resize_large_terminal,
bench_resize_small_image,
bench_resize_performance_target_validation,
bench_resize_filter_comparison,
bench_full_resize_pipeline,
bench_load_and_resize_pipeline,
);
criterion_main!(benches);