Merge branch 'for-john' of git://x-git.kernel.org/pub/scm/linux/kernel/git/jberg...
[firefly-linux-kernel-4.4.55.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
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)
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 }