Complete imaging and meshing integration gate (#44)
Some checks failed
Imaging and meshing gate / native (macos-latest) (push) Has been cancelled
Imaging and meshing gate / native (ubuntu-latest) (push) Has been cancelled
Imaging and meshing gate / native (windows-latest) (push) Has been cancelled
JPEG 2000 feature / linux (push) Has been cancelled
JPEG 2000 feature / macos (push) Has been cancelled
JPEG 2000 feature / windows (push) Has been cancelled
Skia feature / linux (push) Has been cancelled
Skia feature / macos (push) Has been cancelled
Skia feature / windows (push) Has been cancelled
Some checks failed
Imaging and meshing gate / native (macos-latest) (push) Has been cancelled
Imaging and meshing gate / native (ubuntu-latest) (push) Has been cancelled
Imaging and meshing gate / native (windows-latest) (push) Has been cancelled
JPEG 2000 feature / linux (push) Has been cancelled
JPEG 2000 feature / macos (push) Has been cancelled
JPEG 2000 feature / windows (push) Has been cancelled
Skia feature / linux (push) Has been cancelled
Skia feature / macos (push) Has been cancelled
Skia feature / windows (push) Has been cancelled
This commit is contained in:
48
crates/libremetaverse-imaging/benches/image_pipeline.rs
Normal file
48
crates/libremetaverse-imaging/benches/image_pipeline.rs
Normal file
@@ -0,0 +1,48 @@
|
||||
use std::alloc::System;
|
||||
use std::hint::black_box;
|
||||
use std::time::Instant;
|
||||
|
||||
use libremetaverse_imaging::{ManagedImage, ManagedImageImageChannels};
|
||||
use stats_alloc::{INSTRUMENTED_SYSTEM, Region, StatsAlloc};
|
||||
|
||||
#[global_allocator]
|
||||
static ALLOCATOR: &StatsAlloc<System> = &INSTRUMENTED_SYSTEM;
|
||||
|
||||
fn main() {
|
||||
const INPUT_SIDE: i32 = 2_048;
|
||||
const OUTPUT_SIDE: i32 = 1_024;
|
||||
|
||||
let channels = ManagedImageImageChannels(
|
||||
ManagedImageImageChannels::COLOR.0 | ManagedImageImageChannels::ALPHA.0,
|
||||
);
|
||||
let mut source = ManagedImage::new(INPUT_SIDE, INPUT_SIDE, channels)
|
||||
.expect("large benchmark image must fit the documented pixel bound");
|
||||
for (index, red) in source.red.iter_mut().enumerate() {
|
||||
*red = u8::try_from(index & 0xff).expect("masked sample");
|
||||
}
|
||||
source.green.fill(97);
|
||||
source.blue.fill(193);
|
||||
source.alpha.fill(255);
|
||||
|
||||
// Warm the validation path before measuring the owned clone, resize, and export pipeline.
|
||||
source.validate().expect("valid benchmark image");
|
||||
let allocation_region = Region::new(ALLOCATOR);
|
||||
let started = Instant::now();
|
||||
let mut resized = source.clone().expect("bounded image clone");
|
||||
resized
|
||||
.resize_bilinear(OUTPUT_SIDE, OUTPUT_SIDE)
|
||||
.expect("bounded bilinear resize");
|
||||
let rgba = resized.export_raw().expect("bounded RGBA export");
|
||||
let elapsed = started.elapsed();
|
||||
let allocation_stats = allocation_region.change();
|
||||
|
||||
assert_eq!((resized.width, resized.height), (OUTPUT_SIDE, OUTPUT_SIDE));
|
||||
assert_eq!(rgba.len(), 4 * OUTPUT_SIDE as usize * OUTPUT_SIDE as usize);
|
||||
black_box((resized, rgba));
|
||||
println!(
|
||||
"image pipeline: {INPUT_SIDE}x{INPUT_SIDE} -> {OUTPUT_SIDE}x{OUTPUT_SIDE} in {elapsed:?}, {} allocations, {} reallocations, {} bytes allocated",
|
||||
allocation_stats.allocations,
|
||||
allocation_stats.reallocations,
|
||||
allocation_stats.bytes_allocated,
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user