fast-hex/fast-hex-benches/benches/enc.rs

77 lines
3.2 KiB
Rust

#![feature(generic_const_exprs)]
#![feature(new_uninit)]
#![feature(portable_simd)]
use std::mem::MaybeUninit;
use criterion::{black_box, criterion_group, criterion_main, Criterion};
use fast_hex::enc::{Encode as _, Encoder};
use fast_hex::test::name;
// TODO: change this example text to something less silly
const ASCII_BYTES: &[u8; 16] = b"Donald J. Trump!";
const HEX_BYTES: &[u8; ASCII_BYTES.len() * 2] = b"446F6E616C64204A2E205472756D7021";
// TODO: change this example text to something less silly
const ASCII_BYTES_LONG: &[u8; 256] = b"Donald J. Trump!Donald J. Trump!Donald J. Trump!Donald J. Trump!Donald J. Trump!Donald J. Trump!Donald J. Trump!Donald J. Trump!Donald J. Trump!Donald J. Trump!Donald J. Trump!Donald J. Trump!Donald J. Trump!Donald J. Trump!Donald J. Trump!Donald J. Trump!";
const HEX_BYTES_LONG: &[u8; ASCII_BYTES_LONG.len() * 2] = b"446F6E616C64204A2E205472756D7021446F6E616C64204A2E205472756D7021446F6E616C64204A2E205472756D7021446F6E616C64204A2E205472756D7021446F6E616C64204A2E205472756D7021446F6E616C64204A2E205472756D7021446F6E616C64204A2E205472756D7021446F6E616C64204A2E205472756D7021446F6E616C64204A2E205472756D7021446F6E616C64204A2E205472756D7021446F6E616C64204A2E205472756D7021446F6E616C64204A2E205472756D7021446F6E616C64204A2E205472756D7021446F6E616C64204A2E205472756D7021446F6E616C64204A2E205472756D7021446F6E616C64204A2E205472756D7021";
type EncUpper = Encoder::<true>;
type EncLower = Encoder::<false>;
fn benchmark_sized<const N: usize, const HEAP_ONLY: bool>(
name: &str,
bytes: &[u8; N],
c: &mut Criterion,
) where
[(); N * 2]:,
{
if !HEAP_ONLY {
c.bench_function(name!(name, "enc/upper/const"), |b| {
b.iter(|| EncUpper::enc_const(black_box(bytes)))
});
c.bench_function(name!(name, "enc/lower/const"), |b| {
b.iter(|| EncLower::enc_const(black_box(bytes)))
});
c.bench_function(name!(name, "enc/upper/sized"), |b| {
b.iter(|| EncUpper::enc_sized(black_box(bytes)))
});
c.bench_function(name!(name, "enc/lower/sized"), |b| {
b.iter(|| EncLower::enc_sized(black_box(bytes)))
});
}
c.bench_function(name!(name, "enc/upper/sized-heap"), |b| {
b.iter(|| EncUpper::enc_sized_heap(black_box(bytes)))
});
c.bench_function(name!(name, "enc/lower/sized-heap"), |b| {
b.iter(|| EncLower::enc_sized_heap(black_box(bytes)))
});
benchmark(name, bytes, c);
}
fn benchmark(name: &str, bytes: &[u8], c: &mut Criterion) {
c.bench_function(name!(name, "enc/upper/slice"), |b| {
b.iter(|| EncUpper::enc_slice(black_box(bytes)))
});
c.bench_function(name!(name, "enc/lower/slice"), |b| {
b.iter(|| EncLower::enc_slice(black_box(bytes)))
});
}
pub fn bench_16(c: &mut Criterion) {
benchmark_sized::<{ ASCII_BYTES.len() }, false>("16", ASCII_BYTES, c);
}
pub fn bench_256(c: &mut Criterion) {
benchmark_sized::<{ ASCII_BYTES_LONG.len() }, false>("256", ASCII_BYTES_LONG, c);
}
fn verification() {
brisk::simd::if_trace_simd! {
panic!("Illegal benchmark state: SIMD tracing enabled");
}
}
criterion_group!(encode_benches, bench_16, bench_256);
criterion_main!(verification, encode_benches);