diff options
| -rw-r--r-- | tools/perf/builtin-stat.c | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index 9c6377f7152f..e9424fa72420 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c | |||
| @@ -75,7 +75,7 @@ static int null_run = 0; | |||
| 75 | static int fd[MAX_NR_CPUS][MAX_COUNTERS]; | 75 | static int fd[MAX_NR_CPUS][MAX_COUNTERS]; |
| 76 | 76 | ||
| 77 | static u64 event_res[MAX_COUNTERS][3]; | 77 | static u64 event_res[MAX_COUNTERS][3]; |
| 78 | static u64 event_scaled[MAX_COUNTERS]; | 78 | static int event_scaled[MAX_COUNTERS]; |
| 79 | 79 | ||
| 80 | struct stats | 80 | struct stats |
| 81 | { | 81 | { |
| @@ -97,17 +97,31 @@ static double avg_stats(struct stats *stats) | |||
| 97 | } | 97 | } |
| 98 | 98 | ||
| 99 | /* | 99 | /* |
| 100 | * stddev = sqrt(1/N (\Sum n_i^2) - avg(n)^2) | 100 | * http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance |
| 101 | * | ||
| 102 | * (\Sum n_i^2) - ((\Sum n_i)^2)/n | ||
| 103 | * s^2 ------------------------------- | ||
| 104 | * n - 1 | ||
| 105 | * | ||
| 106 | * http://en.wikipedia.org/wiki/Stddev | ||
| 107 | * | ||
| 108 | * The std dev of the mean is related to the std dev by: | ||
| 109 | * | ||
| 110 | * s | ||
| 111 | * s_mean = ------- | ||
| 112 | * sqrt(n) | ||
| 113 | * | ||
| 101 | */ | 114 | */ |
| 102 | static double stddev_stats(struct stats *stats) | 115 | static double stddev_stats(struct stats *stats) |
| 103 | { | 116 | { |
| 104 | double avg = stats->sum / run_count; | 117 | double avg = stats->sum / run_count; |
| 118 | double variance = (stats->sum_sq - stats->sum*avg)/(run_count - 1); | ||
| 119 | double variance_mean = variance / run_count; | ||
| 105 | 120 | ||
| 106 | return sqrt(stats->sum_sq/run_count - avg*avg); | 121 | return sqrt(variance_mean); |
| 107 | } | 122 | } |
| 108 | 123 | ||
| 109 | struct stats event_res_stats[MAX_COUNTERS][3]; | 124 | struct stats event_res_stats[MAX_COUNTERS][3]; |
| 110 | struct stats event_scaled_stats[MAX_COUNTERS]; | ||
| 111 | struct stats runtime_nsecs_stats; | 125 | struct stats runtime_nsecs_stats; |
| 112 | struct stats walltime_nsecs_stats; | 126 | struct stats walltime_nsecs_stats; |
| 113 | struct stats runtime_cycles_stats; | 127 | struct stats runtime_cycles_stats; |
| @@ -343,11 +357,10 @@ static void abs_printout(int counter, double avg, double stddev) | |||
| 343 | static void print_counter(int counter) | 357 | static void print_counter(int counter) |
| 344 | { | 358 | { |
| 345 | double avg, stddev; | 359 | double avg, stddev; |
| 346 | int scaled; | 360 | int scaled = event_scaled[counter]; |
| 347 | 361 | ||
| 348 | avg = avg_stats(&event_res_stats[counter][0]); | 362 | avg = avg_stats(&event_res_stats[counter][0]); |
| 349 | stddev = stddev_stats(&event_res_stats[counter][0]); | 363 | stddev = stddev_stats(&event_res_stats[counter][0]); |
| 350 | scaled = avg_stats(&event_scaled_stats[counter]); | ||
| 351 | 364 | ||
| 352 | if (scaled == -1) { | 365 | if (scaled == -1) { |
| 353 | fprintf(stderr, " %14s %-24s\n", | 366 | fprintf(stderr, " %14s %-24s\n", |
