[−][src]Struct criterion::Bencher
Timer struct to iterate a benchmarked function and measure the runtime.
This struct provides different timing loops as methods. Each timing loop provides a different way to time a routine and each has advantages and disadvantages.
- If your routine requires no per-iteration setup and returns a value with an expensive
drop
method, useiter_with_large_drop
. - If your routine requires some per-iteration setup that shouldn't be timed, use
iter_batched
oriter_batched_ref
. SeeBatchSize
for a discussion of batch sizes. If the setup value implementsDrop
and you don't want to include thedrop
time in the measurement, useiter_batched_ref
, otherwise useiter_batched
. These methods are also suitable for benchmarking routines which return a value with an expensivedrop
method, but are more complex thaniter_with_large_drop
. - Otherwise, use
iter
.
Methods
impl Bencher
[src]
pub fn iter<O, R>(&mut self, routine: R) where
R: FnMut() -> O,
[src]
R: FnMut() -> O,
Times a routine
by executing it many times and timing the total elapsed time.
Prefer this timing loop when routine
returns a value that doesn't have a destructor.
Timing model
Note that the Bencher
also times the time required to destroy the output of routine()
.
Therefore prefer this timing loop when the runtime of mem::drop(O)
is negligible compared
to the runtime of the routine
.
elapsed = Instant::now + iters * (routine + mem::drop(O) + Range::next)
Example
#[macro_use] extern crate criterion; use criterion::*; // The function to benchmark fn foo() { // ... } fn bench(c: &mut Criterion) { c.bench_function("iter", move |b| { b.iter(|| foo()) }); } criterion_group!(benches, bench); criterion_main!(benches);
pub fn iter_batched<I, O, S, R>(
&mut self,
setup: S,
routine: R,
size: BatchSize
) where
S: FnMut() -> I,
R: FnMut(I) -> O,
[src]
&mut self,
setup: S,
routine: R,
size: BatchSize
) where
S: FnMut() -> I,
R: FnMut(I) -> O,
Times a routine
that requires some input by generating a batch of input, then timing the
iteration of the benchmark over the input. See BatchSize
for
details on choosing the batch size. Use this when the routine must consume its input.
For example, use this loop to benchmark sorting algorithms, because they require unsorted data on each iteration.
Timing model
elapsed = (Instant::now * num_batches) + (iters * (routine + O::drop)) + Vec::extend
Example
#[macro_use] extern crate criterion; use criterion::*; fn create_scrambled_data() -> Vec<u64> { // ... } // The sorting algorithm to test fn sort(data: &mut [u64]) { // ... } fn bench(c: &mut Criterion) { let data = create_scrambled_data(); c.bench_function("with_setup", move |b| { // This will avoid timing the to_vec call. b.iter_batched(|| data.clone(), |mut data| sort(&mut data), BatchSize::SmallInput) }); } criterion_group!(benches, bench); criterion_main!(benches);
pub fn iter_batched_ref<I, O, S, R>(
&mut self,
setup: S,
routine: R,
size: BatchSize
) where
S: FnMut() -> I,
R: FnMut(&mut I) -> O,
[src]
&mut self,
setup: S,
routine: R,
size: BatchSize
) where
S: FnMut() -> I,
R: FnMut(&mut I) -> O,
Times a routine
that requires some input by generating a batch of input, then timing the
iteration of the benchmark over the input. See BatchSize
for
details on choosing the batch size. Use this when the routine should accept the input by
mutable reference.
For example, use this loop to benchmark sorting algorithms, because they require unsorted data on each iteration.
Timing model
elapsed = (Instant::now * num_batches) + (iters * routine) + Vec::extend
Example
#[macro_use] extern crate criterion; use criterion::*; fn create_scrambled_data() -> Vec<u64> { // ... } // The sorting algorithm to test fn sort(data: &mut [u64]) { // ... } fn bench(c: &mut Criterion) { let data = create_scrambled_data(); c.bench_function("with_setup", move |b| { // This will avoid timing the to_vec call. b.iter_batched(|| data.clone(), |mut data| sort(&mut data), BatchSize::SmallInput) }); } criterion_group!(benches, bench); criterion_main!(benches);
Trait Implementations
impl Clone for Bencher
[src]
fn clone(&self) -> Bencher
[src]
fn clone_from(&mut self, source: &Self)
1.0.0[src]
Performs copy-assignment from source
. Read more
impl Copy for Bencher
[src]
Auto Trait Implementations
Blanket Implementations
impl<T, U> Into for T where
U: From<T>,
[src]
U: From<T>,
impl<T> ToOwned for T where
T: Clone,
[src]
T: Clone,
impl<T> From for T
[src]
impl<T, U> TryFrom for T where
U: Into<T>,
[src]
U: Into<T>,
type Error = !
try_from
)The type returned in the event of a conversion error.
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
[src]
impl<T> Borrow for T where
T: ?Sized,
[src]
T: ?Sized,
impl<T, U> TryInto for T where
U: TryFrom<T>,
[src]
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error
try_from
)The type returned in the event of a conversion error.
fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>
[src]
impl<T> Any for T where
T: 'static + ?Sized,
[src]
T: 'static + ?Sized,
impl<T> BorrowMut for T where
T: ?Sized,
[src]
T: ?Sized,