#![feature(test)]
extern crate test;
extern crate xalloc;
use test::Bencher;
use xalloc::*;
struct Xorshift32(u32);
impl Xorshift32 {
fn next(&mut self) -> u32 {
self.0 ^= self.0 << 13;
self.0 ^= self.0 >> 17;
self.0 ^= self.0 << 5;
!self.0
}
}
#[bench]
fn bitmap_random(b: &mut Bencher) {
let mut v: Vec<_> = (0..512).map(|_| None).collect();
let mut sa = BitmapAlloc::new(512);
b.iter(|| {
let mut r = Xorshift32(0x11451419);
for _ in 0..65536 {
let i = ((r.next() >> 8) & 511) as usize;
if v[i].is_some() {
sa.dealloc_relaxed(v[i].take().unwrap());
} else {
v[i] = Some(sa.alloc(1).unwrap().0);
}
}
for x in v.iter_mut() {
if let Some(x) = x.take() {
sa.dealloc_relaxed(x);
}
}
});
}
#[bench]
fn bitmap_4_random(b: &mut Bencher) {
let mut v: Vec<_> = (0..512).map(|_| None).collect();
let mut sa = BitmapAlloc::new(512 * 4);
b.iter(|| {
let mut r = Xorshift32(0x11451419);
for _ in 0..65536 {
let i = ((r.next() >> 8) & 511) as usize;
if v[i].is_some() {
sa.dealloc_relaxed(v[i].take().unwrap());
} else {
v[i] = Some(sa.alloc(4).unwrap().0);
}
}
for x in v.iter_mut() {
if let Some(x) = x.take() {
sa.dealloc_relaxed(x);
}
}
});
}