1
- use std:: collections:: HashMap ;
1
+ use std:: collections:: BTreeMap ;
2
2
use std:: ffi:: { OsStr , OsString } ;
3
3
use std:: fmt:: Write as _;
4
4
use std:: fs:: { self , File } ;
@@ -489,7 +489,9 @@ impl Command {
489
489
sh. read_dir ( benches_dir) ?
490
490
. into_iter ( )
491
491
. 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 ( ) )
493
495
. collect ( )
494
496
} else {
495
497
benches. into_iter ( ) . collect ( )
@@ -530,14 +532,16 @@ impl Command {
530
532
stddev : f64 ,
531
533
}
532
534
533
- let gather_results = || -> Result < HashMap < & str , BenchResult > > {
535
+ let gather_results = || -> Result < BTreeMap < & str , BenchResult > > {
534
536
let baseline_temp_dir = results_json_dir. unwrap ( ) ;
535
- let mut results = HashMap :: new ( ) ;
537
+ let mut results = BTreeMap :: new ( ) ;
536
538
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" ) ?;
541
545
results. insert ( bench as & str , result) ;
542
546
}
543
547
Ok ( results)
@@ -549,15 +553,15 @@ impl Command {
549
553
serde_json:: to_writer_pretty ( BufWriter :: new ( baseline) , & results) ?;
550
554
} else if let Some ( baseline_file) = load_baseline {
551
555
let new_results = gather_results ( ) ?;
552
- let baseline_results: HashMap < String , BenchResult > = {
556
+ let baseline_results: BTreeMap < String , BenchResult > = {
553
557
let f = File :: open ( baseline_file) ?;
554
558
serde_json:: from_reader ( BufReader :: new ( f) ) ?
555
559
} ;
556
560
println ! (
557
561
"Comparison with baseline (relative speed, lower is better for the new results):"
558
562
) ;
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 } ;
561
565
562
566
// Compare results (inspired by hyperfine)
563
567
let ratio = new_result. mean / baseline_result. mean ;
0 commit comments