linux/tools/perf/util/stat.c
<<
>>
Prefs
   1#include <math.h>
   2
   3#include "stat.h"
   4
   5void 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
  21double 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 */
  42double 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
  55double 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