From 2d65537ee7cd4a0818ea80a97ab7932368fff5cd Mon Sep 17 00:00:00 2001 From: Ingo Molnar Date: Wed, 27 May 2009 21:36:22 +0200 Subject: [PATCH] pref_counter: tools: report: Add header printout & prettify Old default output: 3.12% perf-report [.] ./perf-report: dsos__find 2.44% perf-report [k] kernel: kallsyms_expand_symbol 2.28% :4483 [.] : 2.05% :4174 [k] kernel: _spin_lock_irqsave 2.01% perf-report [k] kernel: vsnprintf 1.92% perf-report [k] kernel: format_decode 1.92% :4438 [k] kernel: _spin_lock New default output: # # Overhead Command File: Symbol # ........ ....... ............ # 6.54% perf [k] kernel: kallsyms_expand_symbol 6.26% perf [.] /home/mingo/tip/Documentation/perf_counter/perf: dso__insert_symbol 4.76% perf [.] /home/mingo/tip/Documentation/perf_counter/perf: hex2long 4.55% perf [k] kernel: number 4.48% perf [k] kernel: format_decode 4.09% perf [k] kernel: vsnprintf Cc: Peter Zijlstra Cc: Paul Mackerras Cc: Corey Ashford Cc: Arnaldo Carvalho de Melo Cc: John Kacur Cc: Mike Galbraith LKML-Reference: <20090527182101.229504802@chello.nl> Signed-off-by: Ingo Molnar --- Documentation/perf_counter/builtin-report.c | 40 +++++++++++++++------ 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/Documentation/perf_counter/builtin-report.c b/Documentation/perf_counter/builtin-report.c index 30e12c7f710..6df95c2698c 100644 --- a/Documentation/perf_counter/builtin-report.c +++ b/Documentation/perf_counter/builtin-report.c @@ -708,6 +708,7 @@ struct sort_entry { struct list_head list; int64_t (*cmp)(struct hist_entry *, struct hist_entry *); + size_t (*print_header)(FILE *fp); size_t (*print)(FILE *fp, struct hist_entry *); }; @@ -722,7 +723,7 @@ sort__thread_print(FILE *fp, struct hist_entry *self) { char bf[32]; - return fprintf(fp, "%14s ", + return fprintf(fp, " %16s", thread__name(self->thread, bf, sizeof(bf))); } @@ -752,7 +753,7 @@ sort__comm_cmp(struct hist_entry *left, struct hist_entry *right) static size_t sort__comm_print(FILE *fp, struct hist_entry *self) { - return fprintf(fp, "%20s ", self->thread->comm ?: ""); + return fprintf(fp, " %16s", self->thread->comm ?: ""); } static struct sort_entry sort_comm = { @@ -781,7 +782,7 @@ sort__dso_cmp(struct hist_entry *left, struct hist_entry *right) static size_t sort__dso_print(FILE *fp, struct hist_entry *self) { - return fprintf(fp, "%64s ", self->dso ? self->dso->name : ""); + return fprintf(fp, " %64s", self->dso ? self->dso->name : ""); } static struct sort_entry sort_dso = { @@ -803,21 +804,33 @@ sort__sym_cmp(struct hist_entry *left, struct hist_entry *right) return (int64_t)(ip_r - ip_l); } +static size_t sort__sym_print_header(FILE *fp) +{ + size_t ret = 0; + + ret += fprintf(fp, "#\n"); + ret += fprintf(fp, "# Overhead Command File: Symbol\n"); + ret += fprintf(fp, "# ........ ....... ............\n"); + ret += fprintf(fp, "#\n"); + + return ret; +} + static size_t sort__sym_print(FILE *fp, struct hist_entry *self) { size_t ret = 0; - ret += fprintf(fp, "[%c] ", self->level); + ret += fprintf(fp, " [%c] ", self->level); if (verbose) - ret += fprintf(fp, "%#018llx ", (unsigned long long)self->ip); + ret += fprintf(fp, " %#018llx", (unsigned long long)self->ip); if (self->level != '.') - ret += fprintf(fp, "%s ", + ret += fprintf(fp, " kernel: %s", self->sym ? self->sym->name : ""); else - ret += fprintf(fp, "%s: %s ", + ret += fprintf(fp, " %s: %s", self->dso ? self->dso->name : "", self->sym ? self->sym->name : ""); @@ -825,8 +838,9 @@ sort__sym_print(FILE *fp, struct hist_entry *self) } static struct sort_entry sort_sym = { - .cmp = sort__sym_cmp, - .print = sort__sym_print, + .cmp = sort__sym_cmp, + .print_header = sort__sym_print_header, + .print = sort__sym_print, }; struct sort_dimension { @@ -898,7 +912,7 @@ hist_entry__fprintf(FILE *fp, struct hist_entry *self, uint64_t total_samples) size_t ret; if (total_samples) { - ret = fprintf(fp, "%5.2f%% ", + ret = fprintf(fp, " %5.2f%%", (self->count * 100.0) / total_samples); } else ret = fprintf(fp, "%12d ", self->count); @@ -1003,9 +1017,15 @@ static void output__resort(void) static size_t output__fprintf(FILE *fp, uint64_t total_samples) { struct hist_entry *pos; + struct sort_entry *se; struct rb_node *nd; size_t ret = 0; + list_for_each_entry(se, &hist_entry__sort_list, list) { + if (se->print_header) + ret += se->print_header(fp); + } + for (nd = rb_first(&output_hists); nd; nd = rb_next(nd)) { pos = rb_entry(nd, struct hist_entry, rb_node); ret += hist_entry__fprintf(fp, pos, total_samples); -- 2.41.0