diff --git a/scripts/bench_rq.sh b/benches/bench_rq.sh similarity index 100% rename from scripts/bench_rq.sh rename to benches/bench_rq.sh diff --git a/benches/general.rs b/benches/general.rs index 96fa9e7..01af305 100644 --- a/benches/general.rs +++ b/benches/general.rs @@ -29,6 +29,13 @@ fn available_threads() -> usize { std::thread::available_parallelism().map(|n| n.get()).unwrap_or(1) } +fn env_sets() -> u32 { + std::env::var("SMARM_BENCH_SETS") + .ok() + .and_then(|v| v.parse().ok()) + .unwrap_or(5) +} + fn print_header(title: &str) { println!("\n{}", "=".repeat(80)); println!(" {title}"); @@ -41,14 +48,17 @@ fn print_header(title: &str) { } fn run_n (u64, u128)>(name: &str, n: u32, mut f: F) { - let mut times = Vec::new(); + let sets = env_sets(); + let mut times = Vec::with_capacity((n * sets) as usize); let mut last = 0u64; - // One warmup iteration, discarded. + // One warmup before all sets, discarded. let _ = f(); - for _ in 0..n { - let (v, t) = f(); - times.push(t); - last = v; + for _ in 0..sets { + for _ in 0..n { + let (v, t) = f(); + times.push(t); + last = v; + } } times.sort_unstable(); let median = times[times.len() / 2]; @@ -406,7 +416,8 @@ fn main() { let n = available_threads(); println!("smarm general benchmarks"); println!("available parallelism: {n} threads"); - println!("ITERS={ITERS} (+1 warmup, discarded)"); + let sets = env_sets(); + println!("ITERS={ITERS}×{sets} sets = {} samples (+1 warmup, discarded)", ITERS * sets); println!( "CHAIN_DEPTH={CHAIN_DEPTH}, YIELD_TASKS={YIELD_TASKS}×{YIELD_ROUNDS}, \ PRIME_N={PRIME_N}/{PRIME_WORKERS} workers, PP_ROUNDS={PP_ROUNDS}" diff --git a/benches/smarm_favored.rs b/benches/smarm_favored.rs index ed39e6d..e1bda29 100644 --- a/benches/smarm_favored.rs +++ b/benches/smarm_favored.rs @@ -40,6 +40,13 @@ fn available_threads() -> usize { std::thread::available_parallelism().map(|n| n.get()).unwrap_or(1) } +fn env_sets() -> u32 { + std::env::var("SMARM_BENCH_SETS") + .ok() + .and_then(|v| v.parse().ok()) + .unwrap_or(5) +} + fn print_header(title: &str) { println!("\n{}", "=".repeat(80)); println!(" {title}"); @@ -52,13 +59,17 @@ fn print_header(title: &str) { } fn run_n (u64, u128)>(name: &str, n: u32, mut f: F) { - let mut times = Vec::new(); + let sets = env_sets(); + let mut times = Vec::with_capacity((n * sets) as usize); let mut last = 0u64; - let _ = f(); // warmup - for _ in 0..n { - let (v, t) = f(); - times.push(t); - last = v; + // One warmup before all sets, discarded. + let _ = f(); + for _ in 0..sets { + for _ in 0..n { + let (v, t) = f(); + times.push(t); + last = v; + } } times.sort_unstable(); let median = times[times.len() / 2]; @@ -385,7 +396,8 @@ fn main() { let n = available_threads(); println!("smarm smarm-favored benchmarks"); println!("available parallelism: {n} threads"); - println!("ITERS={ITERS} (+1 warmup, discarded)"); + let sets = env_sets(); + println!("ITERS={ITERS}×{sets} sets = {} samples (+1 warmup, discarded)", ITERS * sets); println!( "RECURSE_DEPTH={RECURSE_DEPTH}, HOT_YIELDS={HOT_YIELDS}×2, \ UNCONT_MSGS={UNCONT_MSGS}, PANIC_TASKS={PANIC_TASKS}" diff --git a/benches/tokio_favored.rs b/benches/tokio_favored.rs index dd96a00..bddb5b3 100644 --- a/benches/tokio_favored.rs +++ b/benches/tokio_favored.rs @@ -39,6 +39,13 @@ fn available_threads() -> usize { std::thread::available_parallelism().map(|n| n.get()).unwrap_or(1) } +fn env_sets() -> u32 { + std::env::var("SMARM_BENCH_SETS") + .ok() + .and_then(|v| v.parse().ok()) + .unwrap_or(5) +} + fn print_header(title: &str) { println!("\n{}", "=".repeat(80)); println!(" {title}"); @@ -51,13 +58,17 @@ fn print_header(title: &str) { } fn run_n (u64, u128)>(name: &str, n: u32, mut f: F) { - let mut times = Vec::new(); + let sets = env_sets(); + let mut times = Vec::with_capacity((n * sets) as usize); let mut last = 0u64; - let _ = f(); // warmup - for _ in 0..n { - let (v, t) = f(); - times.push(t); - last = v; + // One warmup before all sets, discarded. + let _ = f(); + for _ in 0..sets { + for _ in 0..n { + let (v, t) = f(); + times.push(t); + last = v; + } } times.sort_unstable(); let median = times[times.len() / 2]; @@ -434,7 +445,8 @@ fn main() { let n = available_threads(); println!("smarm tokio-favored benchmarks"); println!("available parallelism: {n} threads"); - println!("ITERS={ITERS} (+1 warmup, discarded)"); + let sets = env_sets(); + println!("ITERS={ITERS}×{sets} sets = {} samples (+1 warmup, discarded)", ITERS * sets); println!( "STORM_BACKGROUND={STORM_BACKGROUND}, STORM_SPAWN={STORM_SPAWN}, \ MPSC={MPSC_PRODUCERS}×{MPSC_PER_PRODUCER}, \