From c641816b5737a5b65eca0852e5743dbe8274ae9f Mon Sep 17 00:00:00 2001 From: Michael Schimmel Date: Fri, 20 Feb 2026 17:21:09 +0100 Subject: [PATCH] Update tester.rs --- src/utils/tester.rs | 57 ++++++++++++++++++++++++++++----------------- 1 file changed, 36 insertions(+), 21 deletions(-) diff --git a/src/utils/tester.rs b/src/utils/tester.rs index a3d045c..fd22687 100644 --- a/src/utils/tester.rs +++ b/src/utils/tester.rs @@ -81,7 +81,7 @@ pub fn run_benchmarks(update: bool) -> Vec { let baseline_match = baseline_re.captures(&content); let repeat_match = repeat_re.captures(&content); - + let mut repeats = repeat_match .and_then(|m| m.get(1)) .and_then(|m| m.as_str().parse::().ok()) @@ -104,18 +104,19 @@ pub fn run_benchmarks(update: bool) -> Vec { }; // Helper to measure sum of VM execution times over N fresh environments - let measure_sum = |n: u32, node: &crate::ast::compiler::TypedNode| -> Result { - let mut total = Duration::ZERO; - for _ in 0..n { - let env = Environment::new(); - // Link is still required per environment as it populates registries - let linked = env.link(node.clone()); - let start = Instant::now(); - let _ = env.run(&linked)?; - total += start.elapsed(); - } - Ok(total) - }; + let measure_sum = + |n: u32, node: &crate::ast::compiler::TypedNode| -> Result { + let mut total = Duration::ZERO; + for _ in 0..n { + let env = Environment::new(); + // Link is still required per environment as it populates registries + let linked = env.link(node.clone()); + let start = Instant::now(); + let _ = env.run(&linked)?; + total += start.elapsed(); + } + Ok(total) + }; if update { repeats = 1; @@ -142,14 +143,22 @@ pub fn run_benchmarks(update: bool) -> Vec { } } } - if results.last().map_or(false, |r| r.name == name) { continue; } + if results.last().map_or(false, |r| r.name == name) { + continue; + } } let mut runs = Vec::new(); let mut error = None; // Adaptive samples: High repeats need fewer samples for stable median - let num_samples = if repeats > 1000 { 10 } else if repeats > 100 { 30 } else { 100 }; - + let num_samples = if repeats > 1000 { + 10 + } else if repeats > 100 { + 30 + } else { + 100 + }; + for _ in 0..num_samples { match measure_sum(repeats, &compiled_once) { Ok(d) => runs.push(d), @@ -178,7 +187,7 @@ pub fn run_benchmarks(update: bool) -> Vec { if update { let new_val = format_duration(median_single); let mut updated_content = content.clone(); - + // 1. Update/Insert Benchmark let bench_line = format!(";; Benchmark: {}", new_val); if let Some(m) = baseline_match { @@ -188,8 +197,14 @@ pub fn run_benchmarks(update: bool) -> Vec { } // 2. Update/Insert/Remove Benchmark-Repeat - let repeat_line = if repeats > 1 { Some(format!(";; Benchmark-Repeat: {}", repeats)) } else { None }; - let current_repeat_str = repeat_re.captures(&updated_content).map(|m| m.get(0).unwrap().as_str().to_string()); + let repeat_line = if repeats > 1 { + Some(format!(";; Benchmark-Repeat: {}", repeats)) + } else { + None + }; + let current_repeat_str = repeat_re + .captures(&updated_content) + .map(|m| m.get(0).unwrap().as_str().to_string()); if let Some(line) = repeat_line { if let Some(old_line) = current_repeat_str { @@ -197,7 +212,7 @@ pub fn run_benchmarks(update: bool) -> Vec { } else if let Some(m) = baseline_re.captures(&updated_content) { let b_str = m.get(0).unwrap().as_str().to_string(); if let Some(pos) = updated_content.find(&b_str) { - updated_content.insert_str(pos + b_str.len(), &format!("\n{}", line)); + updated_content.insert_str(pos + b_str.len(), &format!("\n{}", line)); } } } else if let Some(old_line) = current_repeat_str { @@ -219,7 +234,7 @@ pub fn run_benchmarks(update: bool) -> Vec { let diff = (median_single.as_nanos() as f64 / baseline.as_nanos() as f64) - 1.0; - let threshold = if is_release { 0.15 } else { 0.5 }; + let threshold = if is_release { 0.10 } else { 0.25 }; let status = if median_single > baseline && diff > threshold { "FAILED" } else {