]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - tools/perf/util/stat.c
arm: imx6: defconfig: update tx6 defconfigs
[karo-tx-linux.git] / tools / perf / util / stat.c
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 }