Skip to content

Commit 26da69a

Browse files
committed
Add variance/std dev utility functions; implement latency measurement using rust
1 parent 6831eb9 commit 26da69a

2 files changed

Lines changed: 50 additions & 1 deletion

File tree

benchmarks/src/language.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -354,12 +354,20 @@ async fn latency() -> Result<(), Error> {
354354
// Let's calculate average latency and standard deviation
355355
println!(
356356
"{}: {} ms",
357-
"Avergae latency".blue().bold(),
357+
"Average latency".blue().bold(),
358358
utils_rustfs::mean(&latency_vec[..])
359359
.unwrap()
360360
.to_string()
361361
.green()
362362
);
363+
println!(
364+
"{}: {} ms",
365+
"latency std dev".blue().bold(),
366+
utils_rustfs::std_deviation(&latency_vec[..])
367+
.unwrap()
368+
.to_string()
369+
.green()
370+
);
363371

364372
spdk_rs::thread::put_io_channel(io_channel);
365373
spdk_rs::bdev::close(desc);

utils/src/lib.rs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,31 @@ where
223223
}
224224
}
225225

226+
/// Calculate sample variance of the given data
227+
pub fn variance(data: &[f64]) -> Option<f64> {
228+
match data.len() {
229+
0 => None,
230+
_ => {
231+
let mean = mean(data);
232+
let mut v: f64 = 0.0;
233+
for s in data {
234+
let x = s - mean.unwrap();
235+
v = v + x * x;
236+
}
237+
let denom = (data.len() - 1) as f64;
238+
Some(v / denom)
239+
}
240+
}
241+
}
242+
243+
/// Calculate standard deviation of the given data
244+
pub fn std_deviation(data: &[f64]) -> Option<f64> {
245+
match data.len() {
246+
0 => None,
247+
_ => Some(variance(data).unwrap().sqrt()),
248+
}
249+
}
250+
226251
#[cfg(test)]
227252
mod tests {
228253
use super::*;
@@ -343,5 +368,21 @@ mod tests {
343368
let numbers = [10, -21, 15, 20, 18, 14, 18];
344369
let err = "Slice is empty.";
345370
assert_eq!(10.571428571428571, mean(&numbers).expect(err));
371+
let numbers2 = [727.7, 1086.5, 1091.0, 1361.3, 1490.5, 1956.1];
372+
assert_eq!(1285.5166666666667, mean(&numbers2).expect(err));
373+
}
374+
375+
#[test]
376+
fn test_variance() {
377+
let numbers = [727.7, 1086.5, 1091.0, 1361.3, 1490.5, 1956.1];
378+
let err = "Slice is empty.";
379+
assert_eq!(177209.41766666662, variance(&numbers).expect(err));
380+
}
381+
382+
#[test]
383+
fn test_std_deviation() {
384+
let numbers = [727.7, 1086.5, 1091.0, 1361.3, 1490.5, 1956.1];
385+
let err = "Slice is empty.";
386+
assert_eq!(420.96248961952256, std_deviation(&numbers).expect(err));
346387
}
347388
}

0 commit comments

Comments
 (0)