diff --git a/crates/bencher_compat/src/compat.rs b/crates/bencher_compat/src/compat.rs index c0d221a..9cbd8aa 100644 --- a/crates/bencher_compat/src/compat.rs +++ b/crates/bencher_compat/src/compat.rs @@ -1,4 +1,4 @@ -use codspeed::codspeed::{black_box, CodSpeed}; +use codspeed::codspeed::{black_box, CodSpeed, WARMUP_RUNS}; pub struct Bencher { pub bytes: u64, @@ -24,6 +24,9 @@ impl Bencher { F: FnMut() -> T, { let uri = self.current_uri.as_str(); + for _ in 0..WARMUP_RUNS { + black_box(inner()); + } self.codspeed.start_benchmark(uri); black_box(inner()); self.codspeed.end_benchmark(); diff --git a/crates/codspeed/src/codspeed.rs b/crates/codspeed/src/codspeed.rs index 6543113..78a9ac5 100644 --- a/crates/codspeed/src/codspeed.rs +++ b/crates/codspeed/src/codspeed.rs @@ -4,6 +4,8 @@ use colored::Colorize; use crate::measurement; +pub const WARMUP_RUNS: u32 = 5; + //TODO: use std::hint::black_box when it's stable pub fn black_box(dummy: T) -> T { unsafe { diff --git a/crates/criterion_compat/src/compat/bencher.rs b/crates/criterion_compat/src/compat/bencher.rs index ce659b0..ed5499d 100644 --- a/crates/criterion_compat/src/compat/bencher.rs +++ b/crates/criterion_compat/src/compat/bencher.rs @@ -20,6 +20,9 @@ impl Bencher { R: FnMut() -> O, { let mut codspeed = self.codspeed.borrow_mut(); + for _ in 0..codspeed::codspeed::WARMUP_RUNS { + black_box(routine()); + } codspeed.start_benchmark(self.uri.as_str()); black_box(routine()); codspeed.end_benchmark(); @@ -44,6 +47,11 @@ impl Bencher { R: FnMut(I) -> O, { let mut codspeed = self.codspeed.borrow_mut(); + for _ in 0..codspeed::codspeed::WARMUP_RUNS { + let input = black_box(setup()); + let output = routine(input); + drop(black_box(output)); + } let input = black_box(setup()); codspeed.start_benchmark(self.uri.as_str()); let output = routine(input); @@ -82,8 +90,15 @@ impl Bencher { R: FnMut(&mut I) -> O, { let mut codspeed = self.codspeed.borrow_mut(); - let mut input = black_box(setup()); + for _ in 0..codspeed::codspeed::WARMUP_RUNS { + let mut input = black_box(setup()); + let output = routine(&mut input); + drop(black_box(output)); + drop(black_box(input)); + } + + let mut input = black_box(setup()); codspeed.start_benchmark(self.uri.as_str()); let output = routine(&mut input); codspeed.end_benchmark();