1- use std::collections::HashMap ;
1+ use std::collections::BTreeMap ;
22use std::ffi::{OsStr, OsString};
33use std::fmt::Write as _;
44use std::fs::{self, File};
@@ -489,7 +489,9 @@ impl Command {
489489 sh.read_dir(benches_dir)?
490490 .into_iter()
491491 .filter(|path| path.is_dir())
492- .map(|path| path.into_os_string().into_string().unwrap())
492+ // Only keep the basename: that matches the usage with a manual bench list,
493+ // and it ensure the path concatenations below work as intended.
494+ .map(|path| path.file_name().unwrap().to_owned().into_string().unwrap())
493495 .collect()
494496 } else {
495497 benches.into_iter().collect()
@@ -530,14 +532,16 @@ impl Command {
530532 stddev: f64,
531533 }
532534
533- let gather_results = || -> Result<HashMap <&str, BenchResult>> {
535+ let gather_results = || -> Result<BTreeMap <&str, BenchResult>> {
534536 let baseline_temp_dir = results_json_dir.unwrap();
535- let mut results = HashMap ::new();
537+ let mut results = BTreeMap ::new();
536538 for bench in &benches {
537- let result = File::open(path!(baseline_temp_dir / format!("{bench}.bench.json")))?;
538- let mut result: serde_json::Value =
539- serde_json::from_reader(BufReader::new(result))?;
540- let result: BenchResult = serde_json::from_value(result["results"][0].take())?;
539+ let result = File::open(path!(baseline_temp_dir / format!("{bench}.bench.json")))
540+ .context("failed to read hyperfine JSON")?;
541+ let mut result: serde_json::Value = serde_json::from_reader(BufReader::new(result))
542+ .context("failed to parse hyperfine JSON")?;
543+ let result: BenchResult = serde_json::from_value(result["results"][0].take())
544+ .context("failed to interpret hyperfine JSON")?;
541545 results.insert(bench as &str, result);
542546 }
543547 Ok(results)
@@ -549,15 +553,15 @@ impl Command {
549553 serde_json::to_writer_pretty(BufWriter::new(baseline), &results)?;
550554 } else if let Some(baseline_file) = load_baseline {
551555 let new_results = gather_results()?;
552- let baseline_results: HashMap <String, BenchResult> = {
556+ let baseline_results: BTreeMap <String, BenchResult> = {
553557 let f = File::open(baseline_file)?;
554558 serde_json::from_reader(BufReader::new(f))?
555559 };
556560 println!(
557561 "Comparison with baseline (relative speed, lower is better for the new results):"
558562 );
559- for (bench, new_result) in new_results.iter() {
560- let Some(baseline_result) = baseline_results.get(* bench) else { continue };
563+ for (bench, new_result) in new_results {
564+ let Some(baseline_result) = baseline_results.get(bench) else { continue };
561565
562566 // Compare results (inspired by hyperfine)
563567 let ratio = new_result.mean / baseline_result.mean;
0 commit comments