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 15 double avg_stats(struct stats *stats) 16 { 17 return stats->mean; 18 } 19 20 /* 21 * http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance 22 * 23 * (\Sum n_i^2) - ((\Sum n_i)^2)/n 24 * s^2 = ------------------------------- 25 * n - 1 26 * 27 * http://en.wikipedia.org/wiki/Stddev 28 * 29 * The std dev of the mean is related to the std dev by: 30 * 31 * s 32 * s_mean = ------- 33 * sqrt(n) 34 * 35 */ 36 double stddev_stats(struct stats *stats) 37 { 38 double variance, variance_mean; 39 40 if (stats->n < 2) 41 return 0.0; 42 43 variance = stats->M2 / (stats->n - 1); 44 variance_mean = variance / stats->n; 45 46 return sqrt(variance_mean); 47 } 48 49 double rel_stddev_stats(double stddev, double avg) 50 { 51 double pct = 0.0; 52 53 if (avg) 54 pct = 100.0 * stddev/avg; 55 56 return pct; 57 } 58