stat.c 1.0 KB

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