@@ -59,7 +59,14 @@ impl From<RawWallTimeData> for WalltimeBenchmark {
5959 let total_time = times_ns. iter ( ) . sum :: < f64 > ( ) / 1_000_000_000.0 ;
6060
6161 let mean_ns = data. mean ( ) . unwrap ( ) ;
62- let stdev_ns = data. std_dev ( ) . unwrap ( ) ;
62+
63+ let stdev_ns = if data. len ( ) < 2 {
64+ // std_dev() returns f64::NAN if data has less than two entries, so we have to
65+ // manually handle this case.
66+ 0.0
67+ } else {
68+ data. std_dev ( ) . unwrap ( )
69+ } ;
6370
6471 let q1_ns = data. quantile ( 0.25 ) ;
6572 let median_ns = data. median ( ) ;
@@ -152,3 +159,28 @@ impl WalltimeResults {
152159 }
153160 }
154161}
162+
163+ #[ cfg( test) ]
164+ mod tests {
165+ use super :: * ;
166+
167+ #[ test]
168+ fn test_parse_single_benchmark ( ) {
169+ let metadata = BenchmarkMetadata {
170+ name : "benchmark" . to_string ( ) ,
171+ uri : "test::benchmark" . to_string ( ) ,
172+ } ;
173+ let raw_bench = RawWallTimeData {
174+ metadata,
175+ iter_per_round : 1 ,
176+ max_time_ns : None ,
177+ times_ns : vec ! [ 42 ] ,
178+ } ;
179+
180+ let benchmark: WalltimeBenchmark = raw_bench. into ( ) ;
181+ assert_eq ! ( benchmark. stats. stdev_ns, 0. ) ;
182+ assert_eq ! ( benchmark. stats. min_ns, 42. ) ;
183+ assert_eq ! ( benchmark. stats. max_ns, 42. ) ;
184+ assert_eq ! ( benchmark. stats. mean_ns, 42. ) ;
185+ }
186+ }
0 commit comments