Last active
February 3, 2023 17:26
-
-
Save zhangyunhao116/11ef41a150f5c23bb47d86255fbeba89 to your computer and use it in GitHub Desktop.
Optimze break patterns
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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