diff options
author | Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com> | 2012-09-17 04:31:14 -0400 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2012-09-17 12:10:03 -0400 |
commit | 0007eceaceb11520071d053acfe06ee3326b1d13 (patch) | |
tree | d9b96c6a53c1ccca87222003e7c5c0e4b0f171a0 | |
parent | 034a9265c289d5298bac7bfd824d3d5b9ec892b4 (diff) |
perf stat: Move stats related code to util/stat.c
Then, the code can be shared between kvm events and perf stat.
Signed-off-by: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>
[ Dong Hao <haodong@linux.vnet.ibm.com>: rebase it on acme's git tree ]
Signed-off-by: Dong Hao <haodong@linux.vnet.ibm.com>
Cc: Avi Kivity <avi@redhat.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: kvm@vger.kernel.org
Cc: Marcelo Tosatti <mtosatti@redhat.com>
Cc: Runzhen Wang <runzhen@linux.vnet.ibm.com>
Cc: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com
Link: http://lkml.kernel.org/r/1347870675-31495-3-git-send-email-haodong@linux.vnet.ibm.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
-rw-r--r-- | tools/perf/Makefile | 1 | ||||
-rw-r--r-- | tools/perf/builtin-stat.c | 56 | ||||
-rw-r--r-- | tools/perf/util/stat.c | 57 | ||||
-rw-r--r-- | tools/perf/util/stat.h | 16 |
4 files changed, 76 insertions, 54 deletions
diff --git a/tools/perf/Makefile b/tools/perf/Makefile index 209774bcee2e..5077f8e2ef72 100644 --- a/tools/perf/Makefile +++ b/tools/perf/Makefile | |||
@@ -406,6 +406,7 @@ LIB_OBJS += $(OUTPUT)util/target.o | |||
406 | LIB_OBJS += $(OUTPUT)util/rblist.o | 406 | LIB_OBJS += $(OUTPUT)util/rblist.o |
407 | LIB_OBJS += $(OUTPUT)util/intlist.o | 407 | LIB_OBJS += $(OUTPUT)util/intlist.o |
408 | LIB_OBJS += $(OUTPUT)util/vdso.o | 408 | LIB_OBJS += $(OUTPUT)util/vdso.o |
409 | LIB_OBJS += $(OUTPUT)util/stat.o | ||
409 | 410 | ||
410 | LIB_OBJS += $(OUTPUT)ui/helpline.o | 411 | LIB_OBJS += $(OUTPUT)ui/helpline.o |
411 | LIB_OBJS += $(OUTPUT)ui/hist.o | 412 | LIB_OBJS += $(OUTPUT)ui/hist.o |
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index dab347d7b010..3c43a3578f31 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c | |||
@@ -51,13 +51,13 @@ | |||
51 | #include "util/evsel.h" | 51 | #include "util/evsel.h" |
52 | #include "util/debug.h" | 52 | #include "util/debug.h" |
53 | #include "util/color.h" | 53 | #include "util/color.h" |
54 | #include "util/stat.h" | ||
54 | #include "util/header.h" | 55 | #include "util/header.h" |
55 | #include "util/cpumap.h" | 56 | #include "util/cpumap.h" |
56 | #include "util/thread.h" | 57 | #include "util/thread.h" |
57 | #include "util/thread_map.h" | 58 | #include "util/thread_map.h" |
58 | 59 | ||
59 | #include <sys/prctl.h> | 60 | #include <sys/prctl.h> |
60 | #include <math.h> | ||
61 | #include <locale.h> | 61 | #include <locale.h> |
62 | 62 | ||
63 | #define DEFAULT_SEPARATOR " " | 63 | #define DEFAULT_SEPARATOR " " |
@@ -199,11 +199,6 @@ static int output_fd; | |||
199 | 199 | ||
200 | static volatile int done = 0; | 200 | static volatile int done = 0; |
201 | 201 | ||
202 | struct stats | ||
203 | { | ||
204 | double n, mean, M2; | ||
205 | }; | ||
206 | |||
207 | struct perf_stat { | 202 | struct perf_stat { |
208 | struct stats res_stats[3]; | 203 | struct stats res_stats[3]; |
209 | }; | 204 | }; |
@@ -220,50 +215,6 @@ static void perf_evsel__free_stat_priv(struct perf_evsel *evsel) | |||
220 | evsel->priv = NULL; | 215 | evsel->priv = NULL; |
221 | } | 216 | } |
222 | 217 | ||
223 | static void update_stats(struct stats *stats, u64 val) | ||
224 | { | ||
225 | double delta; | ||
226 | |||
227 | stats->n++; | ||
228 | delta = val - stats->mean; | ||
229 | stats->mean += delta / stats->n; | ||
230 | stats->M2 += delta*(val - stats->mean); | ||
231 | } | ||
232 | |||
233 | static double avg_stats(struct stats *stats) | ||
234 | { | ||
235 | return stats->mean; | ||
236 | } | ||
237 | |||
238 | /* | ||
239 | * http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance | ||
240 | * | ||
241 | * (\Sum n_i^2) - ((\Sum n_i)^2)/n | ||
242 | * s^2 = ------------------------------- | ||
243 | * n - 1 | ||
244 | * | ||
245 | * http://en.wikipedia.org/wiki/Stddev | ||
246 | * | ||
247 | * The std dev of the mean is related to the std dev by: | ||
248 | * | ||
249 | * s | ||
250 | * s_mean = ------- | ||
251 | * sqrt(n) | ||
252 | * | ||
253 | */ | ||
254 | static double stddev_stats(struct stats *stats) | ||
255 | { | ||
256 | double variance, variance_mean; | ||
257 | |||
258 | if (!stats->n) | ||
259 | return 0.0; | ||
260 | |||
261 | variance = stats->M2 / (stats->n - 1); | ||
262 | variance_mean = variance / stats->n; | ||
263 | |||
264 | return sqrt(variance_mean); | ||
265 | } | ||
266 | |||
267 | static struct stats runtime_nsecs_stats[MAX_NR_CPUS]; | 218 | static struct stats runtime_nsecs_stats[MAX_NR_CPUS]; |
268 | static struct stats runtime_cycles_stats[MAX_NR_CPUS]; | 219 | static struct stats runtime_cycles_stats[MAX_NR_CPUS]; |
269 | static struct stats runtime_stalled_cycles_front_stats[MAX_NR_CPUS]; | 220 | static struct stats runtime_stalled_cycles_front_stats[MAX_NR_CPUS]; |
@@ -559,10 +510,7 @@ static int run_perf_stat(int argc __maybe_unused, const char **argv) | |||
559 | 510 | ||
560 | static void print_noise_pct(double total, double avg) | 511 | static void print_noise_pct(double total, double avg) |
561 | { | 512 | { |
562 | double pct = 0.0; | 513 | double pct = rel_stddev_stats(total, avg); |
563 | |||
564 | if (avg) | ||
565 | pct = 100.0*total/avg; | ||
566 | 514 | ||
567 | if (csv_output) | 515 | if (csv_output) |
568 | fprintf(output, "%s%.2f%%", csv_sep, pct); | 516 | fprintf(output, "%s%.2f%%", csv_sep, pct); |
diff --git a/tools/perf/util/stat.c b/tools/perf/util/stat.c new file mode 100644 index 000000000000..23742126f47c --- /dev/null +++ b/tools/perf/util/stat.c | |||
@@ -0,0 +1,57 @@ | |||
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 | } | ||
diff --git a/tools/perf/util/stat.h b/tools/perf/util/stat.h new file mode 100644 index 000000000000..588367c3c767 --- /dev/null +++ b/tools/perf/util/stat.h | |||
@@ -0,0 +1,16 @@ | |||
1 | #ifndef __PERF_STATS_H | ||
2 | #define __PERF_STATS_H | ||
3 | |||
4 | #include "types.h" | ||
5 | |||
6 | struct stats | ||
7 | { | ||
8 | double n, mean, M2; | ||
9 | }; | ||
10 | |||
11 | void update_stats(struct stats *stats, u64 val); | ||
12 | double avg_stats(struct stats *stats); | ||
13 | double stddev_stats(struct stats *stats); | ||
14 | double rel_stddev_stats(double stddev, double avg); | ||
15 | |||
16 | #endif | ||