pub enum BatchSize {
SmallInput,
LargeInput,
PerIteration,
NumBatches(u64),
NumIterations(u64),
// some variants omitted
}
Expand description
Argument to Bencher::iter_batched
and
Bencher::iter_batched_ref
which controls the
batch size.
Generally speaking, almost all benchmarks should use SmallInput
. If the input or the result
of the benchmark routine is large enough that SmallInput
causes out-of-memory errors,
LargeInput
can be used to reduce memory usage at the cost of increasing the measurement
overhead. If the input or the result is extremely large (or if it holds some
limited external resource like a file handle), PerIteration
will set the number of iterations
per batch to exactly one. PerIteration
can increase the measurement overhead substantially
and should be avoided wherever possible.
Each value lists an estimate of the measurement overhead. This is intended as a rough guide to assist in choosing an option, it should not be relied upon. In particular, it is not valid to subtract the listed overhead from the measurement and assume that the result represents the true runtime of a function. The actual measurement overhead for your specific benchmark depends on the details of the function you’re benchmarking and the hardware and operating system running the benchmark.
With that said, if the runtime of your function is small relative to the measurement overhead
it will be difficult to take accurate measurements. In this situation, the best option is to use
Bencher::iter
which has next-to-zero measurement overhead.
Variants§
SmallInput
SmallInput
indicates that the input to the benchmark routine (the value returned from
the setup routine) is small enough that millions of values can be safely held in memory.
Always prefer SmallInput
unless the benchmark is using too much memory.
In testing, the maximum measurement overhead from benchmarking with SmallInput
is on the
order of 500 picoseconds. This is presented as a rough guide; your results may vary.
LargeInput
LargeInput
indicates that the input to the benchmark routine or the value returned from
that routine is large. This will reduce the memory usage but increase the measurement
overhead.
In testing, the maximum measurement overhead from benchmarking with LargeInput
is on the
order of 750 picoseconds. This is presented as a rough guide; your results may vary.
PerIteration
PerIteration
indicates that the input to the benchmark routine or the value returned from
that routine is extremely large or holds some limited resource, such that holding many values
in memory at once is infeasible. This provides the worst measurement overhead, but the
lowest memory usage.
In testing, the maximum measurement overhead from benchmarking with PerIteration
is on the
order of 350 nanoseconds or 350,000 picoseconds. This is presented as a rough guide; your
results may vary.
NumBatches(u64)
NumBatches
will attempt to divide the iterations up into a given number of batches.
A larger number of batches (and thus smaller batches) will reduce memory usage but increase
measurement overhead. This allows the user to choose their own tradeoff between memory usage
and measurement overhead, but care must be taken in tuning the number of batches. Most
benchmarks should use SmallInput
or LargeInput
instead.
NumIterations(u64)
NumIterations
fixes the batch size to a constant number, specified by the user. This
allows the user to choose their own tradeoff between overhead and memory usage, but care must
be taken in tuning the batch size. In general, the measurement overhead of NumIterations
will be larger than that of NumBatches
. Most benchmarks should use SmallInput
or
LargeInput
instead.
Trait Implementations§
impl Copy for BatchSize
impl Eq for BatchSize
impl StructuralPartialEq for BatchSize
Auto Trait Implementations§
impl Freeze for BatchSize
impl RefUnwindSafe for BatchSize
impl Send for BatchSize
impl Sync for BatchSize
impl Unpin for BatchSize
impl UnwindSafe for BatchSize
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pointable for T
impl<T> Pointable for T
Layout§
Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...)
attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.
Size: 16 bytes
Size for each variant:
SmallInput
: 0 bytesLargeInput
: 0 bytesPerIteration
: 0 bytesNumBatches
: 8 bytesNumIterations
: 8 bytes__NonExhaustive
: 0 bytes