use criterion::{black_box, criterion_group, criterion_main, Criterion}; use rand::SeedableRng; use rand_distr::{Distribution, LogNormal}; use rand_pcg::Lcg64Xsh32; use std::fmt;
#[path = "../src/samples.rs"] mod samples; use samples::*;
/// Generate a large list of u32s for stress testing. #[allow(dead_code)] fn get_needles_and_haystack() -> (Vec<u32>, Vec<u32>) { // Lcg64Xsh32 is a small, fast PRNG for reproducible benchmarks. // LogNormal(10, 1) generates numbers with mean 36315 and mode 8103, a distribution that, in // spirit, correlates with Unicode properties (many low values and a long tail of high values) letmut rng = Lcg64Xsh32::seed_from_u64(2021); let dist = LogNormal::new(10.0, 1.0).unwrap(); let haystack = { letmut unsorted: Vec<u32> = (&dist)
.sample_iter(&mut rng)
.take(1000)
.map(|f| f as u32)
.collect();
unsorted.sort_unstable();
unsorted
}; let needles: Vec<u32> = (&dist)
.sample_iter(&mut rng)
.take(100)
.map(|f| f as u32)
.collect();
(needles, haystack)
}
#[allow(dead_code, clippy::ptr_arg)] fn vec_to_unaligned_uvec<'a, T>(vec: &Vec<T>, buffer: &'a mut AlignedBuffer) -> ZeroVec<'a, T> where
T: EqULE + Copy + PartialEq + fmt::Debug,
{ // Pad with zero to ensure it is not aligned
buffer.0.push(0);
buffer
.0
.extend(ZeroVec::from_slice_or_alloc(vec.as_slice()).as_bytes());
ZeroVec::<T>::parse_bytes(&buffer.0[1..]).unwrap()
}
fn sum_benches(c: &mut Criterion) { let normal_slice = &TEST_SLICE[0..19]; let aligned_ule_slice =
<u32 as AsULE>::ULE::parse_bytes_to_slice(&TEST_BUFFER_LE[0..76]).unwrap(); let unalign_ule_slice =
<u32 as AsULE>::ULE::parse_bytes_to_slice(&TEST_BUFFER_LE[1..77]).unwrap();
c.bench_function("zerovec/binary_search/sample/zerovec", |b| { let zerovec = ZeroVec::<u32>::parse_bytes(black_box(TEST_BUFFER_LE)).unwrap();
b.iter(|| zerovec.binary_search(&0x0c0d0c));
});
let (needles_100, haystack) = get_needles_and_haystack(); // Only search for 50 needles to put all figures in nanoseconds let needles_50 = &needles_100[0..50];
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.