#![allow(
missing_docs,
clippy::needless_borrows_for_generic_args,
clippy::cast_precision_loss
)]
use criterion::{BenchmarkId, Criterion, criterion_group, criterion_main};
use easyofd_core::{ImageObject, OfdPage, TextObject};
use easyofd_reader::OfdReader;
use easyofd_writer::OfdWriter;
fn make_text_ofd_bytes(page_count: usize, texts_per_page: usize) -> Vec<u8> {
let mut writer = OfdWriter::new();
for i in 0..page_count {
let mut page = OfdPage::new(210.0, 297.0);
for j in 0..texts_per_page {
page.add_text(TextObject::new(
10.0,
20.0 + f64::from(u32::try_from(j).unwrap_or(u32::MAX)) * 9.0,
&format!("Page {i} line {j} — easyofd benchmark text payload"),
));
}
writer.add_page(page);
}
writer.build().unwrap()
}
fn make_image_ofd_bytes(page_count: usize) -> Vec<u8> {
let jpeg_data: Vec<u8> = vec![
0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46, 0x00, 0x01, 0x01, 0x00, 0x00,
0x01, 0x00, 0x01, 0x00, 0x00, 0xFF, 0xD9,
];
let mut writer = OfdWriter::new();
for i in 0..page_count {
let mut page = OfdPage::new(210.0, 297.0);
for j in 0..30 {
page.add_text(TextObject::new(
10.0,
20.0 + f64::from(u32::try_from(j).unwrap_or(u32::MAX)) * 9.0,
&format!("Page {i} line {j}"),
));
}
page.add_image(ImageObject::jpeg(
150.0,
200.0,
30.0,
30.0,
jpeg_data.clone(),
));
writer.add_page(page);
}
writer.build().unwrap()
}
fn bench_read_text(c: &mut Criterion) {
let mut group = c.benchmark_group("read_text_30_lines");
for &pages in &[1usize, 10, 100] {
let data = make_text_ofd_bytes(pages, 30);
let size_mb = data.len() as f64 / (1024.0 * 1024.0);
group.throughput(criterion::Throughput::Bytes(data.len() as u64));
group.bench_with_input(BenchmarkId::from_parameter(pages), &data, |b, d| {
b.iter(|| {
let reader = OfdReader::from_bytes(d).unwrap();
let _text = reader.extract_all_text();
});
});
eprintln!(
"[read_text] {pages} pages: {:.2} KB ({:.4} MB)",
data.len() as f64 / 1024.0,
size_mb
);
}
group.finish();
}
fn bench_read_image(c: &mut Criterion) {
let mut group = c.benchmark_group("read_text_plus_image");
for &pages in &[1usize, 10, 100] {
let data = make_image_ofd_bytes(pages);
let size_mb = data.len() as f64 / (1024.0 * 1024.0);
group.throughput(criterion::Throughput::Bytes(data.len() as u64));
group.bench_with_input(BenchmarkId::from_parameter(pages), &data, |b, d| {
b.iter(|| {
let reader = OfdReader::from_bytes(d).unwrap();
let _text = reader.extract_all_text();
});
});
eprintln!(
"[read_image] {pages} pages: {:.2} KB ({:.4} MB)",
data.len() as f64 / 1024.0,
size_mb
);
}
group.finish();
}
fn bench_roundtrip_text(c: &mut Criterion) {
let mut group = c.benchmark_group("roundtrip_text_30_lines");
for &pages in &[1usize, 10, 100] {
let data = make_text_ofd_bytes(pages, 30);
group.bench_with_input(BenchmarkId::from_parameter(pages), &data, |b, d| {
b.iter(|| {
let reader = OfdReader::from_bytes(d).unwrap();
let parsed_pages = reader.pages().to_vec();
let mut writer = OfdWriter::new();
for page in &parsed_pages {
writer.add_page(page.clone());
}
let _out = writer.build().unwrap();
});
});
}
group.finish();
}
fn bench_roundtrip_image(c: &mut Criterion) {
let mut group = c.benchmark_group("roundtrip_text_plus_image");
for &pages in &[1usize, 10, 100] {
let data = make_image_ofd_bytes(pages);
group.bench_with_input(BenchmarkId::from_parameter(pages), &data, |b, d| {
b.iter(|| {
let reader = OfdReader::from_bytes(d).unwrap();
let parsed_pages = reader.pages().to_vec();
let mut writer = OfdWriter::new();
for page in &parsed_pages {
writer.add_page(page.clone());
}
let _out = writer.build().unwrap();
});
});
}
group.finish();
}
criterion_group!(
benches,
bench_read_text,
bench_read_image,
bench_roundtrip_text,
bench_roundtrip_image
);
criterion_main!(benches);