@@ -59,7 +59,14 @@ impl From<RawWallTimeData> for WalltimeBenchmark {
59
59
let total_time = times_ns. iter ( ) . sum :: < f64 > ( ) / 1_000_000_000.0 ;
60
60
61
61
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
+ } ;
63
70
64
71
let q1_ns = data. quantile ( 0.25 ) ;
65
72
let median_ns = data. median ( ) ;
@@ -152,3 +159,28 @@ impl WalltimeResults {
152
159
}
153
160
}
154
161
}
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