use super::measurement::Measurement;
use crate::__rt::web_time::Instant;
use core::future::Future;
use core::hint::black_box;
use core::time::Duration;
pub struct Bencher<'a, M: Measurement> {
pub(crate) iterated: bool, pub(crate) iters: u64, pub(crate) value: Duration, pub(crate) measurement: &'a M, pub(crate) elapsed_time: Duration, }
impl<'a, M: Measurement> Bencher<'a, M> {
#[inline(never)]
pub fn iter<O, R>(&mut self, mut routine: R)
where
R: FnMut() -> O,
{
self.iterated = true;
let start = self.measurement.start();
for _ in 0..self.iters {
black_box(routine());
}
let end = self.measurement.end(start);
self.value = end;
self.elapsed_time = end;
}
#[inline(never)]
pub fn iter_custom<R>(&mut self, mut routine: R)
where
R: FnMut(u64) -> Duration,
{
self.iterated = true;
let time_start = Instant::now();
self.value = routine(self.iters);
self.elapsed_time = time_start.elapsed();
}
#[inline(never)]
pub async fn iter_future<O, R, Fut>(&mut self, mut routine: R)
where
R: FnMut() -> Fut,
Fut: Future<Output = O>,
{
self.iterated = true;
let start = self.measurement.start();
for _ in 0..self.iters {
black_box(routine().await);
}
let end = self.measurement.end(start);
self.value = end;
self.elapsed_time = end;
}
#[inline(never)]
pub async fn iter_custom_future<R, Fut>(&mut self, mut routine: R)
where
R: FnMut(u64) -> Fut,
Fut: Future<Output = Duration>,
{
self.iterated = true;
let time_start = Instant::now();
self.value = routine(self.iters).await;
self.elapsed_time = time_start.elapsed();
}
}