It is identical to the 32-bit format, except with more precision and range due to using more bits. This format should comfortably store any color information with precision easily exceeding the limits of human vision.
85 lines
2.2 KiB
Rust
85 lines
2.2 KiB
Rust
use bencher::{benchmark_group, benchmark_main, black_box, Bencher};
|
|
use rand::{rngs::SmallRng, FromEntropy, Rng};
|
|
use trifloat::{signed48, unsigned32, unsigned40};
|
|
|
|
//----
|
|
|
|
fn unsigned32_encode_100_values(bench: &mut Bencher) {
|
|
let mut rng = SmallRng::from_entropy();
|
|
bench.iter(|| {
|
|
let x = rng.gen::<f32>();
|
|
let y = rng.gen::<f32>();
|
|
let z = rng.gen::<f32>();
|
|
for _ in 0..100 {
|
|
black_box(unsigned32::encode(black_box((x, y, z))));
|
|
}
|
|
});
|
|
}
|
|
|
|
fn unsigned32_decode_100_values(bench: &mut Bencher) {
|
|
let mut rng = SmallRng::from_entropy();
|
|
bench.iter(|| {
|
|
let v = rng.gen::<u32>();
|
|
for _ in 0..100 {
|
|
black_box(unsigned32::decode(black_box(v)));
|
|
}
|
|
});
|
|
}
|
|
|
|
fn unsigned40_encode_100_values(bench: &mut Bencher) {
|
|
let mut rng = SmallRng::from_entropy();
|
|
bench.iter(|| {
|
|
let x = rng.gen::<f32>();
|
|
let y = rng.gen::<f32>();
|
|
let z = rng.gen::<f32>();
|
|
for _ in 0..100 {
|
|
black_box(unsigned40::encode(black_box((x, y, z))));
|
|
}
|
|
});
|
|
}
|
|
|
|
fn unsigned40_decode_100_values(bench: &mut Bencher) {
|
|
let mut rng = SmallRng::from_entropy();
|
|
bench.iter(|| {
|
|
let v = rng.gen::<u64>();
|
|
for _ in 0..100 {
|
|
black_box(unsigned40::decode(black_box(v)));
|
|
}
|
|
});
|
|
}
|
|
|
|
fn signed48_encode_100_values(bench: &mut Bencher) {
|
|
let mut rng = SmallRng::from_entropy();
|
|
bench.iter(|| {
|
|
let x = rng.gen::<f32>() - 0.5;
|
|
let y = rng.gen::<f32>() - 0.5;
|
|
let z = rng.gen::<f32>() - 0.5;
|
|
for _ in 0..100 {
|
|
black_box(signed48::encode(black_box((x, y, z))));
|
|
}
|
|
});
|
|
}
|
|
|
|
fn signed48_decode_100_values(bench: &mut Bencher) {
|
|
let mut rng = SmallRng::from_entropy();
|
|
bench.iter(|| {
|
|
let v = rng.gen::<u64>() & 0x0000_FFFF_FFFF_FFFF;
|
|
for _ in 0..100 {
|
|
black_box(signed48::decode(black_box(v)));
|
|
}
|
|
});
|
|
}
|
|
|
|
//----
|
|
|
|
benchmark_group!(
|
|
benches,
|
|
unsigned32_encode_100_values,
|
|
unsigned32_decode_100_values,
|
|
unsigned40_encode_100_values,
|
|
unsigned40_decode_100_values,
|
|
signed48_encode_100_values,
|
|
signed48_decode_100_values,
|
|
);
|
|
benchmark_main!(benches);
|