#![allow(non_snake_case)]
extern crate test;
-extern crate rand;
use test::Bencher;
use rand::seq::*;
use std::mem::size_of;
+// We force use of 32-bit RNG since seq code is optimised for use with 32-bit
+// generators on all platforms.
+use rand_pcg::Pcg32 as SmallRng;
+
const RAND_BENCH_N: u64 = 1000;
#[bench]
fn seq_shuffle_100(b: &mut Bencher) {
let mut rng = SmallRng::from_rng(thread_rng()).unwrap();
- let x : &mut [usize] = &mut [1; 100];
+ let x: &mut [usize] = &mut [1; 100];
b.iter(|| {
x.shuffle(&mut rng);
x[0]
#[bench]
fn seq_slice_choose_1_of_1000(b: &mut Bencher) {
let mut rng = SmallRng::from_rng(thread_rng()).unwrap();
- let x : &mut [usize] = &mut [1; 1000];
+ let x: &mut [usize] = &mut [1; 1000];
for i in 0..1000 {
x[i] = i;
}
}
s
});
- b.bytes = size_of::<usize>() as u64 * ::RAND_BENCH_N;
+ b.bytes = size_of::<usize>() as u64 * crate::RAND_BENCH_N;
}
macro_rules! seq_slice_choose_multiple {
#[bench]
fn $name(b: &mut Bencher) {
let mut rng = SmallRng::from_rng(thread_rng()).unwrap();
- let x : &[i32] = &[$amount; $length];
+ let x: &[i32] = &[$amount; $length];
let mut result = [0i32; $amount];
b.iter(|| {
// Collect full result to prevent unwanted shortcuts getting
// first element (in case sample_indices returns an iterator).
- for (slot, sample) in result.iter_mut().zip(
- x.choose_multiple(&mut rng, $amount)) {
+ for (slot, sample) in result.iter_mut().zip(x.choose_multiple(&mut rng, $amount)) {
*slot = *sample;
}
- result[$amount-1]
+ result[$amount - 1]
})
}
- }
+ };
}
seq_slice_choose_multiple!(seq_slice_choose_multiple_1_of_1000, 1, 1000);
#[bench]
fn seq_iter_choose_from_1000(b: &mut Bencher) {
let mut rng = SmallRng::from_rng(thread_rng()).unwrap();
- let x : &mut [usize] = &mut [1; 1000];
+ let x: &mut [usize] = &mut [1; 1000];
for i in 0..1000 {
x[i] = i;
}
}
s
});
- b.bytes = size_of::<usize>() as u64 * ::RAND_BENCH_N;
+ b.bytes = size_of::<usize>() as u64 * crate::RAND_BENCH_N;
}
#[derive(Clone)]
}
impl<I: Iterator + Clone> Iterator for UnhintedIterator<I> {
type Item = I::Item;
+
fn next(&mut self) -> Option<Self::Item> {
self.iter.next()
}
}
impl<I: ExactSizeIterator + Iterator + Clone> Iterator for WindowHintedIterator<I> {
type Item = I::Item;
+
fn next(&mut self) -> Option<Self::Item> {
self.iter.next()
}
+
fn size_hint(&self) -> (usize, Option<usize>) {
(std::cmp::min(self.iter.len(), self.window_size), None)
}
#[bench]
fn seq_iter_unhinted_choose_from_1000(b: &mut Bencher) {
let mut rng = SmallRng::from_rng(thread_rng()).unwrap();
- let x : &[usize] = &[1; 1000];
+ let x: &[usize] = &[1; 1000];
b.iter(|| {
- UnhintedIterator { iter: x.iter() }.choose(&mut rng).unwrap()
+ UnhintedIterator { iter: x.iter() }
+ .choose(&mut rng)
+ .unwrap()
})
}
#[bench]
fn seq_iter_window_hinted_choose_from_1000(b: &mut Bencher) {
let mut rng = SmallRng::from_rng(thread_rng()).unwrap();
- let x : &[usize] = &[1; 1000];
+ let x: &[usize] = &[1; 1000];
b.iter(|| {
- WindowHintedIterator { iter: x.iter(), window_size: 7 }.choose(&mut rng)
+ WindowHintedIterator {
+ iter: x.iter(),
+ window_size: 7,
+ }
+ .choose(&mut rng)
})
}
#[bench]
fn seq_iter_choose_multiple_10_of_100(b: &mut Bencher) {
let mut rng = SmallRng::from_rng(thread_rng()).unwrap();
- let x : &[usize] = &[1; 100];
- b.iter(|| {
- x.iter().cloned().choose_multiple(&mut rng, 10)
- })
+ let x: &[usize] = &[1; 100];
+ b.iter(|| x.iter().cloned().choose_multiple(&mut rng, 10))
}
#[bench]
fn seq_iter_choose_multiple_fill_10_of_100(b: &mut Bencher) {
let mut rng = SmallRng::from_rng(thread_rng()).unwrap();
- let x : &[usize] = &[1; 100];
+ let x: &[usize] = &[1; 100];
let mut buf = [0; 10];
- b.iter(|| {
- x.iter().cloned().choose_multiple_fill(&mut rng, &mut buf)
- })
+ b.iter(|| x.iter().cloned().choose_multiple_fill(&mut rng, &mut buf))
}
macro_rules! sample_indices {
#[bench]
fn $name(b: &mut Bencher) {
let mut rng = SmallRng::from_rng(thread_rng()).unwrap();
- b.iter(|| {
- index::$fn(&mut rng, $length, $amount)
- })
+ b.iter(|| index::$fn(&mut rng, $length, $amount))
}
- }
+ };
}
sample_indices!(misc_sample_indices_1_of_1k, sample, 1, 1000);