diff options
author | Anton Blanchard <anton@samba.org> | 2009-10-18 07:29:23 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-10-19 03:20:21 -0400 |
commit | 11018201b831e19304c0d639f105ad6c27e120b1 (patch) | |
tree | 531051de316cdf54b8193d11fb843d7432419d2c /tools/perf | |
parent | f39cdf25bf77219676ec5360980ac40b1a7e144a (diff) |
perf stat: Add branch performance metric
When we count both branches and branch-misses it is useful to
print out the percentage of branch-misses:
# perf stat -e branches -e branch-misses /bin/true
Performance counter stats for '/bin/true':
401684 branches # 0.000 M/sec
23301 branch-misses # 5.801 %
Signed-off-by: Anton Blanchard <anton@samba.org>
Cc: paulus@samba.org
Cc: a.p.zijlstra@chello.nl
LKML-Reference: <20091018112923.GQ4808@kryten>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'tools/perf')
-rw-r--r-- | tools/perf/builtin-stat.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index 3db31e7bf173..c37368343fff 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c | |||
@@ -125,6 +125,7 @@ struct stats event_res_stats[MAX_COUNTERS][3]; | |||
125 | struct stats runtime_nsecs_stats; | 125 | struct stats runtime_nsecs_stats; |
126 | struct stats walltime_nsecs_stats; | 126 | struct stats walltime_nsecs_stats; |
127 | struct stats runtime_cycles_stats; | 127 | struct stats runtime_cycles_stats; |
128 | struct stats runtime_branches_stats; | ||
128 | 129 | ||
129 | #define MATCH_EVENT(t, c, counter) \ | 130 | #define MATCH_EVENT(t, c, counter) \ |
130 | (attrs[counter].type == PERF_TYPE_##t && \ | 131 | (attrs[counter].type == PERF_TYPE_##t && \ |
@@ -235,6 +236,8 @@ static void read_counter(int counter) | |||
235 | update_stats(&runtime_nsecs_stats, count[0]); | 236 | update_stats(&runtime_nsecs_stats, count[0]); |
236 | if (MATCH_EVENT(HARDWARE, HW_CPU_CYCLES, counter)) | 237 | if (MATCH_EVENT(HARDWARE, HW_CPU_CYCLES, counter)) |
237 | update_stats(&runtime_cycles_stats, count[0]); | 238 | update_stats(&runtime_cycles_stats, count[0]); |
239 | if (MATCH_EVENT(HARDWARE, HW_BRANCH_INSTRUCTIONS, counter)) | ||
240 | update_stats(&runtime_branches_stats, count[0]); | ||
238 | } | 241 | } |
239 | 242 | ||
240 | static int run_perf_stat(int argc __used, const char **argv) | 243 | static int run_perf_stat(int argc __used, const char **argv) |
@@ -352,6 +355,14 @@ static void abs_printout(int counter, double avg) | |||
352 | ratio = avg / total; | 355 | ratio = avg / total; |
353 | 356 | ||
354 | fprintf(stderr, " # %10.3f IPC ", ratio); | 357 | fprintf(stderr, " # %10.3f IPC ", ratio); |
358 | } else if (MATCH_EVENT(HARDWARE, HW_BRANCH_MISSES, counter)) { | ||
359 | total = avg_stats(&runtime_branches_stats); | ||
360 | |||
361 | if (total) | ||
362 | ratio = avg * 100 / total; | ||
363 | |||
364 | fprintf(stderr, " # %10.3f %% ", ratio); | ||
365 | |||
355 | } else { | 366 | } else { |
356 | total = avg_stats(&runtime_nsecs_stats); | 367 | total = avg_stats(&runtime_nsecs_stats); |
357 | 368 | ||