1 #include <math.h> 2 3 #include "stat.h" 4 5 void update_stats(struct stats *stats, u64 val) 6 { 7 double delta; 8 9 stats->n++; 10 delta = val - stats->mean; 11 stats->mean += delta / stats->n; 12 stats->M2 += delta*(val - stats->mean); 13 14 if (val > stats->max) 15 stats->max = val; 16 17 if (val < stats->min) 18 stats->min = val; 19 } 20 21 double avg_stats(struct stats *stats) 22 { 23 return stats->mean; 24 } 25 26 /* 27 * http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance 28 * 29 * (\Sum n_i^2) - ((\Sum n_i)^2)/n 30 * s^2 = ------------------------------- 31 * n - 1 32 * 33 * http://en.wikipedia.org/wiki/Stddev 34 * 35 * The std dev of the mean is related to the std dev by: 36 * 37 * s 38 * s_mean = ------- 39 * sqrt(n) 40 * 41 */ 42 double stddev_stats(struct stats *stats) 43 { 44 double variance, variance_mean; 45 46 if (stats->n < 2) 47 return 0.0; 48 49 variance = stats->M2 / (stats->n - 1); 50 variance_mean = variance / stats->n; 51 52 return sqrt(variance_mean); 53 } 54 55 double rel_stddev_stats(double stddev, double avg) 56 { 57 double pct = 0.0; 58 59 if (avg) 60 pct = 100.0 * stddev/avg; 61 62 return pct; 63 } 64