aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIngo Molnar <mingo@elte.hu>2011-04-27 06:16:10 -0400
committerIngo Molnar <mingo@elte.hu>2011-04-26 14:04:58 -0400
commitc78df6c1d49b5d798f1579141e3a12be7c325d1e (patch)
tree355d14ae8b178d93a95012c13a930ea41384dd1d
parenta5d243d04a150acbfa79d641154f49e5d920f64f (diff)
perf stat: Print branch misses warning colors
Print the missed-branches percentage with different warning level ASCII colors, as the percentage passes the 5%/10%/20% thresholds. These thresholds are set to relatively low levels, because on most CPUs even a moderate percentage of branch-misses already shows up as a slowdown. Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Acked-by: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Link: http://lkml.kernel.org/n/tip-ybqukg7p86leiup7gl03ecgk@git.kernel.org Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r--tools/perf/builtin-stat.c31
1 files changed, 24 insertions, 7 deletions
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
index e7d91f9cf789..5d4e1b9b2d89 100644
--- a/tools/perf/builtin-stat.c
+++ b/tools/perf/builtin-stat.c
@@ -450,6 +450,29 @@ static void print_stalled_cycles(int cpu, struct perf_evsel *evsel __used, doubl
450 fprintf(stderr, " of all cycles are idle "); 450 fprintf(stderr, " of all cycles are idle ");
451} 451}
452 452
453static void print_branch_misses(int cpu, struct perf_evsel *evsel __used, double avg)
454{
455 double total, ratio = 0.0;
456 const char *color;
457
458 total = avg_stats(&runtime_branches_stats[cpu]);
459
460 if (total)
461 ratio = avg / total * 100.0;
462
463 color = PERF_COLOR_NORMAL;
464 if (ratio > 20.0)
465 color = PERF_COLOR_RED;
466 else if (ratio > 10.0)
467 color = PERF_COLOR_MAGENTA;
468 else if (ratio > 5.0)
469 color = PERF_COLOR_YELLOW;
470
471 fprintf(stderr, " # ");
472 color_fprintf(stderr, color, "%5.2f%%", ratio);
473 fprintf(stderr, " of all branches ");
474}
475
453static void abs_printout(int cpu, struct perf_evsel *evsel, double avg) 476static void abs_printout(int cpu, struct perf_evsel *evsel, double avg)
454{ 477{
455 double total, ratio = 0.0; 478 double total, ratio = 0.0;
@@ -495,13 +518,7 @@ static void abs_printout(int cpu, struct perf_evsel *evsel, double avg)
495 518
496 } else if (perf_evsel__match(evsel, HARDWARE, HW_BRANCH_MISSES) && 519 } else if (perf_evsel__match(evsel, HARDWARE, HW_BRANCH_MISSES) &&
497 runtime_branches_stats[cpu].n != 0) { 520 runtime_branches_stats[cpu].n != 0) {
498 total = avg_stats(&runtime_branches_stats[cpu]); 521 print_branch_misses(cpu, evsel, avg);
499
500 if (total)
501 ratio = avg * 100 / total;
502
503 fprintf(stderr, " # %5.2f %% of all branches ", ratio);
504
505 } else if (perf_evsel__match(evsel, HARDWARE, HW_CACHE_MISSES) && 522 } else if (perf_evsel__match(evsel, HARDWARE, HW_CACHE_MISSES) &&
506 runtime_cacherefs_stats[cpu].n != 0) { 523 runtime_cacherefs_stats[cpu].n != 0) {
507 total = avg_stats(&runtime_cacherefs_stats[cpu]); 524 total = avg_stats(&runtime_cacherefs_stats[cpu]);