It seams like the uninit version is still faster, despite the memcpy bug.
Here is my criterion benchmark setup:
//lib.rs
#![feature(maybe_uninit_uninit_array, min_const_generics)]
pub fn array_init<const LEN: usize>() -> [u8; LEN] {
let x = [0u8; LEN];
x
}
pub fn array_uninit<const LEN: usize>() -> [MaybeUninit<u8>; LEN] {
MaybeUninit::uninit_array()
}
//my_benchmark.rs
use criterion::{black_box, criterion_group, criterion_main, Criterion};
use rust_bench::*;
pub fn criterion_benchmark(c: &mut Criterion) {
c.bench_function("array init 256", |b| b.iter(|| array_init::<256>()));
c.bench_function("array uninit 256", |b| b.iter(|| array_uninit::<256>()));
c.bench_function("array init 512", |b| b.iter(|| array_init::<512>()));
c.bench_function("array uninit 512", |b| b.iter(|| array_uninit::<512>()));
c.bench_function("array init 1024", |b| b.iter(|| array_init::<1024>()));
c.bench_function("array uninit 1024", |b| b.iter(|| array_uninit::<1024>()));
}
criterion_group!(benches, criterion_benchmark);
criterion_main!(benches);
Results:
array init 256 time: [31.249 ns 31.352 ns 31.464 ns]
array uninit 256 time: [30.689 ns 30.780 ns 30.877 ns]
array init 512 time: [69.623 ns 69.774 ns 69.930 ns]
array uninit 512 time: [61.459 ns 61.599 ns 61.783 ns]
array init 1024 time: [134.12 ns 134.46 ns 134.82 ns]
array uninit 1024 time: [124.31 ns 125.42 ns 126.95 ns]