Skip to content

Commit

Permalink
perf_counter tools: Provide helper to print percents color
Browse files Browse the repository at this point in the history
Among perf annotate, perf report and perf top, we can find the
common colored printing of percents according to the following
rules:

    High overhead =  > 5%, colored in red
    Mid overhead =  > 0.5%, colored in green
    Low overhead =  < 0.5%, default color

Factorize these multiple checks in a single function named
percent_color_fprintf() and also provide a get_percent_color()
for sites which print percentages and other things at the same
time.

Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Anton Blanchard <anton@samba.org>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
LKML-Reference: <1246558475-10624-2-git-send-email-fweisbec@gmail.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
  • Loading branch information
fweisbec authored and Ingo Molnar committed Jul 2, 2009
1 parent c20ab37 commit 1e11fd8
Show file tree
Hide file tree
Showing 5 changed files with 38 additions and 56 deletions.
26 changes: 2 additions & 24 deletions tools/perf/builtin-annotate.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,6 @@
#define SHOW_USER 2
#define SHOW_HV 4

#define MIN_GREEN 0.5
#define MIN_RED 5.0


static char const *input_name = "perf.data";
static char *vmlinux = "vmlinux";

Expand Down Expand Up @@ -1047,24 +1043,6 @@ process_event(event_t *event, unsigned long offset, unsigned long head)
return 0;
}

static char *get_color(double percent)
{
char *color = PERF_COLOR_NORMAL;

/*
* We color high-overhead entries in red, mid-overhead
* entries in green - and keep the low overhead places
* normal:
*/
if (percent >= MIN_RED)
color = PERF_COLOR_RED;
else {
if (percent > MIN_GREEN)
color = PERF_COLOR_GREEN;
}
return color;
}

static int
parse_line(FILE *file, struct symbol *sym, u64 start, u64 len)
{
Expand Down Expand Up @@ -1126,7 +1104,7 @@ parse_line(FILE *file, struct symbol *sym, u64 start, u64 len)
} else if (sym->hist_sum)
percent = 100.0 * hits / sym->hist_sum;

color = get_color(percent);
color = get_percent_color(percent);

/*
* Also color the filename and line if needed, with
Expand Down Expand Up @@ -1262,7 +1240,7 @@ static void print_summary(char *filename)

sym_ext = rb_entry(node, struct sym_ext, node);
percent = sym_ext->percent;
color = get_color(percent);
color = get_percent_color(percent);
path = sym_ext->path;

color_fprintf(stdout, color, " %7.2f %s", percent, path);
Expand Down
21 changes: 3 additions & 18 deletions tools/perf/builtin-report.c
Original file line number Diff line number Diff line change
Expand Up @@ -947,25 +947,10 @@ hist_entry__fprintf(FILE *fp, struct hist_entry *self, u64 total_samples)
if (exclude_other && !self->parent)
return 0;

if (total_samples) {
double percent = self->count * 100.0 / total_samples;
char *color = PERF_COLOR_NORMAL;

/*
* We color high-overhead entries in red, mid-overhead
* entries in green - and keep the low overhead places
* normal:
*/
if (percent >= 5.0) {
color = PERF_COLOR_RED;
} else {
if (percent >= 0.5)
color = PERF_COLOR_GREEN;
}

ret = color_fprintf(fp, color, " %6.2f%%",
if (total_samples)
ret = percent_color_fprintf(fp, " %6.2f%%",
(self->count * 100.0) / total_samples);
} else
else
ret = fprintf(fp, "%12Ld ", self->count);

list_for_each_entry(se, &hist_entry__sort_list, list) {
Expand Down
15 changes: 1 addition & 14 deletions tools/perf/builtin-top.c
Original file line number Diff line number Diff line change
Expand Up @@ -239,7 +239,6 @@ static void print_sym_table(void)
for (nd = rb_first(&tmp); nd; nd = rb_next(nd)) {
struct sym_entry *syme = rb_entry(nd, struct sym_entry, rb_node);
struct symbol *sym = (struct symbol *)(syme + 1);
char *color = PERF_COLOR_NORMAL;
double pcnt;

if (++printed > print_entries || syme->snap_count < count_filter)
Expand All @@ -248,24 +247,12 @@ static void print_sym_table(void)
pcnt = 100.0 - (100.0 * ((sum_ksamples - syme->snap_count) /
sum_ksamples));

/*
* We color high-overhead entries in red, mid-overhead
* entries in green - and keep the low overhead places
* normal:
*/
if (pcnt >= 5.0) {
color = PERF_COLOR_RED;
} else {
if (pcnt >= 0.5)
color = PERF_COLOR_GREEN;
}

if (nr_counters == 1)
printf("%20.2f - ", syme->weight);
else
printf("%9.1f %10ld - ", syme->weight, syme->snap_count);

color_fprintf(stdout, color, "%4.1f%%", pcnt);
percent_color_fprintf(stdout, "%4.1f%%", pcnt);
printf(" - %016llx : %s", sym->start, sym->name);
if (sym->module)
printf("\t[%s]", sym->module->name);
Expand Down
27 changes: 27 additions & 0 deletions tools/perf/util/color.c
Original file line number Diff line number Diff line change
Expand Up @@ -242,4 +242,31 @@ int color_fwrite_lines(FILE *fp, const char *color,
return 0;
}

char *get_percent_color(double percent)
{
char *color = PERF_COLOR_NORMAL;

/*
* We color high-overhead entries in red, mid-overhead
* entries in green - and keep the low overhead places
* normal:
*/
if (percent >= MIN_RED)
color = PERF_COLOR_RED;
else {
if (percent > MIN_GREEN)
color = PERF_COLOR_GREEN;
}
return color;
}

int percent_color_fprintf(FILE *fp, const char *fmt, double percent)
{
int r;
char *color;

color = get_percent_color(percent);
r = color_fprintf(fp, color, fmt, percent);

return r;
}
5 changes: 5 additions & 0 deletions tools/perf/util/color.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@
#define PERF_COLOR_CYAN "\033[36m"
#define PERF_COLOR_BG_RED "\033[41m"

#define MIN_GREEN 0.5
#define MIN_RED 5.0

/*
* This variable stores the value of color.ui
*/
Expand All @@ -32,5 +35,7 @@ void color_parse_mem(const char *value, int len, const char *var, char *dst);
int color_fprintf(FILE *fp, const char *color, const char *fmt, ...);
int color_fprintf_ln(FILE *fp, const char *color, const char *fmt, ...);
int color_fwrite_lines(FILE *fp, const char *color, size_t count, const char *buf);
int percent_color_fprintf(FILE *fp, const char *fmt, double percent);
char *get_percent_color(double percent);

#endif /* COLOR_H */

0 comments on commit 1e11fd8

Please sign in to comment.