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 | ||
