fast-hex/benches/enc.rs

75 lines
3.1 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;
const ASCII_BYTES: &[u8; 16] = b"Donald J. Trump!";
const HEX_BYTES: &[u8; ASCII_BYTES.len() * 2] = b"446F6E616C64204A2E205472756D7021";
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);