Commit 021191b3 authored by Arnaldo Carvalho de Melo's avatar Arnaldo Carvalho de Melo Committed by Ingo Molnar

perf report: Make the output more compact

When we filter by column content we may end up with a column
that has the same value for all the lines. So remove that
column and tell its unique value on the top, as a comment.

Example:

  [acme@doppio pahole]$  perf report --sort comm,dso,symbol -d ./build/libdwarves.so.1.0.0 -C pahole | head -15
  # dso: ./build/libdwarves.so.1.0.0
  # comm: pahole
  # Samples: 58409
  #
  # Overhead  Symbol
  # ........  ......
  #
      20.93%  [.] tag__recode_dwarf_type
      14.94%  [.] namespace__recode_dwarf_types
      10.38%  [.] cu__table_add_tag
       6.69%  [.] __die__process_tag
       5.05%  [.] die__process_function
       4.70%  [.] list__for_all_tags
       3.68%  [.] tag__init
       3.48%  [.] die__create_new_parameter
  [acme@doppio pahole]$
Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
LKML-Reference: <1247325517-12272-3-git-send-email-acme@redhat.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 27d0fd41
...@@ -583,6 +583,7 @@ struct sort_entry { ...@@ -583,6 +583,7 @@ struct sort_entry {
int64_t (*collapse)(struct hist_entry *, struct hist_entry *); int64_t (*collapse)(struct hist_entry *, struct hist_entry *);
size_t (*print)(FILE *fp, struct hist_entry *, unsigned int width); size_t (*print)(FILE *fp, struct hist_entry *, unsigned int width);
unsigned int *width; unsigned int *width;
bool elide;
}; };
static int64_t cmp_null(void *l, void *r) static int64_t cmp_null(void *l, void *r)
...@@ -1024,7 +1025,7 @@ hist_entry__fprintf(FILE *fp, struct hist_entry *self, u64 total_samples) ...@@ -1024,7 +1025,7 @@ hist_entry__fprintf(FILE *fp, struct hist_entry *self, u64 total_samples)
ret = fprintf(fp, field_sep ? "%lld" : "%12lld ", self->count); ret = fprintf(fp, field_sep ? "%lld" : "%12lld ", self->count);
list_for_each_entry(se, &hist_entry__sort_list, list) { list_for_each_entry(se, &hist_entry__sort_list, list) {
if (exclude_other && (se == &sort_parent)) if (se->elide)
continue; continue;
fprintf(fp, "%s", field_sep ?: " "); fprintf(fp, "%s", field_sep ?: " ");
...@@ -1079,7 +1080,7 @@ resolve_symbol(struct thread *thread, struct map **mapp, ...@@ -1079,7 +1080,7 @@ resolve_symbol(struct thread *thread, struct map **mapp,
* with no symbol hit that has a name longer than * with no symbol hit that has a name longer than
* the ones with symbols sampled. * the ones with symbols sampled.
*/ */
if (!map->dso->slen_calculated) if (!sort_dso.elide && !map->dso->slen_calculated)
dso__calc_col_width(map->dso); dso__calc_col_width(map->dso);
if (mapp) if (mapp)
...@@ -1356,14 +1357,12 @@ static size_t output__fprintf(FILE *fp, u64 total_samples) ...@@ -1356,14 +1357,12 @@ static size_t output__fprintf(FILE *fp, u64 total_samples)
unsigned int width; unsigned int width;
char *col_width = col_width_list_str; char *col_width = col_width_list_str;
fprintf(fp, "\n"); fprintf(fp, "# Samples: %Ld\n", (u64)total_samples);
fprintf(fp, "#\n");
fprintf(fp, "# (%Ld samples)\n", (u64)total_samples);
fprintf(fp, "#\n"); fprintf(fp, "#\n");
fprintf(fp, "# Overhead"); fprintf(fp, "# Overhead");
list_for_each_entry(se, &hist_entry__sort_list, list) { list_for_each_entry(se, &hist_entry__sort_list, list) {
if (exclude_other && (se == &sort_parent)) if (se->elide)
continue; continue;
if (field_sep) { if (field_sep) {
fprintf(fp, "%c%s", *field_sep, se->header); fprintf(fp, "%c%s", *field_sep, se->header);
...@@ -1392,7 +1391,7 @@ static size_t output__fprintf(FILE *fp, u64 total_samples) ...@@ -1392,7 +1391,7 @@ static size_t output__fprintf(FILE *fp, u64 total_samples)
list_for_each_entry(se, &hist_entry__sort_list, list) { list_for_each_entry(se, &hist_entry__sort_list, list) {
unsigned int i; unsigned int i;
if (exclude_other && (se == &sort_parent)) if (se->elide)
continue; continue;
fprintf(fp, " "); fprintf(fp, " ");
...@@ -2022,7 +2021,8 @@ static void setup_sorting(void) ...@@ -2022,7 +2021,8 @@ static void setup_sorting(void)
} }
static void setup_list(struct strlist **list, const char *list_str, static void setup_list(struct strlist **list, const char *list_str,
const char *list_name) struct sort_entry *se, const char *list_name,
FILE *fp)
{ {
if (list_str) { if (list_str) {
*list = strlist__new(true, list_str); *list = strlist__new(true, list_str);
...@@ -2031,6 +2031,11 @@ static void setup_list(struct strlist **list, const char *list_str, ...@@ -2031,6 +2031,11 @@ static void setup_list(struct strlist **list, const char *list_str,
list_name); list_name);
exit(129); exit(129);
} }
if (strlist__nr_entries(*list) == 1) {
fprintf(fp, "# %s: %s\n", list_name,
strlist__entry(*list, 0)->s);
se->elide = true;
}
} }
} }
...@@ -2044,9 +2049,10 @@ int cmd_report(int argc, const char **argv, const char *prefix __used) ...@@ -2044,9 +2049,10 @@ int cmd_report(int argc, const char **argv, const char *prefix __used)
setup_sorting(); setup_sorting();
if (parent_pattern != default_parent_pattern) if (parent_pattern != default_parent_pattern) {
sort_dimension__add("parent"); sort_dimension__add("parent");
else sort_parent.elide = 1;
} else
exclude_other = 0; exclude_other = 0;
/* /*
...@@ -2055,9 +2061,11 @@ int cmd_report(int argc, const char **argv, const char *prefix __used) ...@@ -2055,9 +2061,11 @@ int cmd_report(int argc, const char **argv, const char *prefix __used)
if (argc) if (argc)
usage_with_options(report_usage, options); usage_with_options(report_usage, options);
setup_list(&dso_list, dso_list_str, "dso"); setup_pager();
setup_list(&comm_list, comm_list_str, "comm");
setup_list(&sym_list, sym_list_str, "symbol"); setup_list(&dso_list, dso_list_str, &sort_dso, "dso", stdout);
setup_list(&comm_list, comm_list_str, &sort_comm, "comm", stdout);
setup_list(&sym_list, sym_list_str, &sort_sym, "symbol", stdout);
if (field_sep && *field_sep == '.') { if (field_sep && *field_sep == '.') {
fputs("'.' is the only non valid --field-separator argument\n", fputs("'.' is the only non valid --field-separator argument\n",
...@@ -2065,7 +2073,5 @@ int cmd_report(int argc, const char **argv, const char *prefix __used) ...@@ -2065,7 +2073,5 @@ int cmd_report(int argc, const char **argv, const char *prefix __used)
exit(129); exit(129);
} }
setup_pager();
return __cmd_report(); return __cmd_report();
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment