#[cfg(test)]
mod tests {
use crate::decompress::bgzf::hot_counters;
fn read_baseline_f64(key: &str, default: f64) -> f64 {
for prefix in &["", "../", "../../"] {
let path = format!("{}benchmarks/baselines.json", prefix);
if let Ok(json) = std::fs::read_to_string(&path) {
if let Some(v) = extract_f64(&json, key) {
return v;
}
}
}
default
}
fn extract_f64(json: &str, key: &str) -> Option<f64> {
let pattern = format!("\"{}\":", key);
let start = json.find(&pattern)? + pattern.len();
let rest = json[start..].trim_start();
let end = rest.find(|c: char| !c.is_ascii_digit() && c != '.' && c != '-')?;
rest[..end].parse().ok()
}
#[test]
fn hot_path_multi_sym_rate_bgzf_text_10mb() {
let fixture = crate::tests::fixtures::text_10mb();
let _ = crate::decompress::bgzf::decompress_bgzf_parallel_to_vec(&fixture.bgzf_gz, 4);
hot_counters::reset();
let _ =
crate::decompress::bgzf::decompress_bgzf_parallel_to_vec(&fixture.bgzf_gz, 4).unwrap();
let (dynamic, multi_sym, standard) = hot_counters::snapshot();
if dynamic == 0 {
eprintln!("hot_path_multi_sym_rate: no dynamic blocks in fixture, skipping");
return;
}
let rate = multi_sym as f64 / dynamic as f64;
let min_rate = read_baseline_f64("multi_sym_min", 0.0);
eprintln!(
"hot_path_multi_sym_rate_bgzf_text_10mb: {}/{} blocks multi-sym ({:.1}%), {}/{} standard ({:.1}%), threshold >= {:.1}%",
multi_sym, dynamic, rate * 100.0,
standard, dynamic, standard as f64 / dynamic as f64 * 100.0,
min_rate * 100.0
);
if std::env::var("RECORD_BASELINES").is_ok() {
println!(
"baseline: hit_rates.multi_sym_min = {:.3}",
(rate * 0.90).max(0.0)
);
return;
}
assert!(
rate >= min_rate,
"multi-sym rate {:.1}% < baseline {:.1}%\n\
The bgzf fast path is being bypassed for {} of {} dynamic blocks.\n\
Check decode_dynamic_into() in bgzf.rs — the use_multi_sym gate may have changed.",
rate * 100.0,
min_rate * 100.0,
standard,
dynamic
);
}
}