Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Xiao Guangrong and committed by
Arnaldo Carvalho de Melo
0007ecea 034a9265

+76 -54
+1
tools/perf/Makefile
··· 406 406 LIB_OBJS += $(OUTPUT)util/rblist.o 407 407 LIB_OBJS += $(OUTPUT)util/intlist.o 408 408 LIB_OBJS += $(OUTPUT)util/vdso.o 409 + LIB_OBJS += $(OUTPUT)util/stat.o 409 410 410 411 LIB_OBJS += $(OUTPUT)ui/helpline.o 411 412 LIB_OBJS += $(OUTPUT)ui/hist.o
+2 -54
tools/perf/builtin-stat.c
··· 51 51 #include "util/evsel.h" 52 52 #include "util/debug.h" 53 53 #include "util/color.h" 54 + #include "util/stat.h" 54 55 #include "util/header.h" 55 56 #include "util/cpumap.h" 56 57 #include "util/thread.h" 57 58 #include "util/thread_map.h" 58 59 59 60 #include <sys/prctl.h> 60 - #include <math.h> 61 61 #include <locale.h> 62 62 63 63 #define DEFAULT_SEPARATOR " " ··· 199 199 200 200 static volatile int done = 0; 201 201 202 - struct stats 203 - { 204 - double n, mean, M2; 205 - }; 206 - 207 202 struct perf_stat { 208 203 struct stats res_stats[3]; 209 204 }; ··· 213 218 { 214 219 free(evsel->priv); 215 220 evsel->priv = NULL; 216 - } 217 - 218 - static void update_stats(struct stats *stats, u64 val) 219 - { 220 - double delta; 221 - 222 - stats->n++; 223 - delta = val - stats->mean; 224 - stats->mean += delta / stats->n; 225 - stats->M2 += delta*(val - stats->mean); 226 - } 227 - 228 - static double avg_stats(struct stats *stats) 229 - { 230 - return stats->mean; 231 - } 232 - 233 - /* 234 - * http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance 235 - * 236 - * (\Sum n_i^2) - ((\Sum n_i)^2)/n 237 - * s^2 = ------------------------------- 238 - * n - 1 239 - * 240 - * http://en.wikipedia.org/wiki/Stddev 241 - * 242 - * The std dev of the mean is related to the std dev by: 243 - * 244 - * s 245 - * s_mean = ------- 246 - * sqrt(n) 247 - * 248 - */ 249 - static double stddev_stats(struct stats *stats) 250 - { 251 - double variance, variance_mean; 252 - 253 - if (!stats->n) 254 - return 0.0; 255 - 256 - variance = stats->M2 / (stats->n - 1); 257 - variance_mean = variance / stats->n; 258 - 259 - return sqrt(variance_mean); 260 221 } 261 222 262 223 static struct stats runtime_nsecs_stats[MAX_NR_CPUS]; ··· 510 559 511 560 static void print_noise_pct(double total, double avg) 512 561 { 513 - double pct = 0.0; 514 - 515 - if (avg) 516 - pct = 100.0*total/avg; 562 + double pct = rel_stddev_stats(total, avg); 517 563 518 564 if (csv_output) 519 565 fprintf(output, "%s%.2f%%", csv_sep, pct);
+57
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 + }
+16
tools/perf/util/stat.h
··· 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