Skip to content

Instantly share code, notes, and snippets.

@zhangyunhao116
Last active February 3, 2023 17:26
Show Gist options
  • Save zhangyunhao116/11ef41a150f5c23bb47d86255fbeba89 to your computer and use it in GitHub Desktop.
Save zhangyunhao116/11ef41a150f5c23bb47d86255fbeba89 to your computer and use it in GitHub Desktop.
Optimze break patterns
use criterion::{criterion_group, criterion_main, Criterion};
fn r1(len: usize) -> usize {
let mut random = len as u32;
let mut gen_u32 = || {
random ^= random << 13;
random ^= random >> 17;
random ^= random << 5;
random
};
let mut gen_usize = || {
if usize::BITS <= 32 {
gen_u32() as usize
} else {
(((gen_u32() as u64) << 32) | (gen_u32() as u64)) as usize
}
};
gen_usize()
}
fn r2(len: usize) -> usize {
let mut seed = len;
let mut gen_usize = || {
if usize::BITS <= 32 {
// Pseudorandom number generator from the "Xorshift RNGs" paper by George Marsaglia.
let mut r = seed as u32;
r ^= r << 13;
r ^= r >> 17;
r ^= r << 5;
seed = r as usize;
seed
} else {
// Pseudorandom number generator from the "wyrand"(https://github.com/wangyi-fudan/wyhash) by Wang Yi.
seed = seed.wrapping_add(0xa0761d6478bd642fu64 as usize);
let r = (seed as u128).wrapping_mul((seed as u64 ^ 0xe7037ed1a0b428dbu64) as u128);
((r as u64) ^ (r >> 64) as u64) as usize
}
};
gen_usize()
}
pub fn criterion_benchmark(c: &mut Criterion) {
let mut count1 = 0usize;
let mut count2 = 0usize;
let mut t1 = || {
count1 += 1;
r1(count1)
};
let mut t2 = || {
count2 += 1;
r2(count2)
};
c.bench_function("old", |b| b.iter(|| t1()));
c.bench_function("new", |b| b.iter(|| t2()));
}
criterion_group!(benches, criterion_benchmark);
criterion_main!(benches);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment