perf_counter tools: Provide helper to print percents color
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>
This commit is contained in:
parent
c20ab37ef3
commit
1e11fd82d2
|
@ -25,10 +25,6 @@
|
||||||
#define SHOW_USER 2
|
#define SHOW_USER 2
|
||||||
#define SHOW_HV 4
|
#define SHOW_HV 4
|
||||||
|
|
||||||
#define MIN_GREEN 0.5
|
|
||||||
#define MIN_RED 5.0
|
|
||||||
|
|
||||||
|
|
||||||
static char const *input_name = "perf.data";
|
static char const *input_name = "perf.data";
|
||||||
static char *vmlinux = "vmlinux";
|
static char *vmlinux = "vmlinux";
|
||||||
|
|
||||||
|
@ -1047,24 +1043,6 @@ process_event(event_t *event, unsigned long offset, unsigned long head)
|
||||||
return 0;
|
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
|
static int
|
||||||
parse_line(FILE *file, struct symbol *sym, u64 start, u64 len)
|
parse_line(FILE *file, struct symbol *sym, u64 start, u64 len)
|
||||||
{
|
{
|
||||||
|
@ -1126,7 +1104,7 @@ parse_line(FILE *file, struct symbol *sym, u64 start, u64 len)
|
||||||
} else if (sym->hist_sum)
|
} else if (sym->hist_sum)
|
||||||
percent = 100.0 * hits / 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
|
* Also color the filename and line if needed, with
|
||||||
|
@ -1262,7 +1240,7 @@ static void print_summary(char *filename)
|
||||||
|
|
||||||
sym_ext = rb_entry(node, struct sym_ext, node);
|
sym_ext = rb_entry(node, struct sym_ext, node);
|
||||||
percent = sym_ext->percent;
|
percent = sym_ext->percent;
|
||||||
color = get_color(percent);
|
color = get_percent_color(percent);
|
||||||
path = sym_ext->path;
|
path = sym_ext->path;
|
||||||
|
|
||||||
color_fprintf(stdout, color, " %7.2f %s", percent, path);
|
color_fprintf(stdout, color, " %7.2f %s", percent, path);
|
||||||
|
|
|
@ -947,25 +947,10 @@ hist_entry__fprintf(FILE *fp, struct hist_entry *self, u64 total_samples)
|
||||||
if (exclude_other && !self->parent)
|
if (exclude_other && !self->parent)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (total_samples) {
|
if (total_samples)
|
||||||
double percent = self->count * 100.0 / total_samples;
|
ret = percent_color_fprintf(fp, " %6.2f%%",
|
||||||
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%%",
|
|
||||||
(self->count * 100.0) / total_samples);
|
(self->count * 100.0) / total_samples);
|
||||||
} else
|
else
|
||||||
ret = fprintf(fp, "%12Ld ", self->count);
|
ret = fprintf(fp, "%12Ld ", self->count);
|
||||||
|
|
||||||
list_for_each_entry(se, &hist_entry__sort_list, list) {
|
list_for_each_entry(se, &hist_entry__sort_list, list) {
|
||||||
|
|
|
@ -239,7 +239,6 @@ static void print_sym_table(void)
|
||||||
for (nd = rb_first(&tmp); nd; nd = rb_next(nd)) {
|
for (nd = rb_first(&tmp); nd; nd = rb_next(nd)) {
|
||||||
struct sym_entry *syme = rb_entry(nd, struct sym_entry, rb_node);
|
struct sym_entry *syme = rb_entry(nd, struct sym_entry, rb_node);
|
||||||
struct symbol *sym = (struct symbol *)(syme + 1);
|
struct symbol *sym = (struct symbol *)(syme + 1);
|
||||||
char *color = PERF_COLOR_NORMAL;
|
|
||||||
double pcnt;
|
double pcnt;
|
||||||
|
|
||||||
if (++printed > print_entries || syme->snap_count < count_filter)
|
if (++printed > print_entries || syme->snap_count < count_filter)
|
||||||
|
@ -248,24 +247,12 @@ static void print_sym_table(void)
|
||||||
pcnt = 100.0 - (100.0 * ((sum_ksamples - syme->snap_count) /
|
pcnt = 100.0 - (100.0 * ((sum_ksamples - syme->snap_count) /
|
||||||
sum_ksamples));
|
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)
|
if (nr_counters == 1)
|
||||||
printf("%20.2f - ", syme->weight);
|
printf("%20.2f - ", syme->weight);
|
||||||
else
|
else
|
||||||
printf("%9.1f %10ld - ", syme->weight, syme->snap_count);
|
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);
|
printf(" - %016llx : %s", sym->start, sym->name);
|
||||||
if (sym->module)
|
if (sym->module)
|
||||||
printf("\t[%s]", sym->module->name);
|
printf("\t[%s]", sym->module->name);
|
||||||
|
|
|
@ -242,4 +242,31 @@ int color_fwrite_lines(FILE *fp, const char *color,
|
||||||
return 0;
|
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;
|
||||||
|
}
|
||||||
|
|
|
@ -15,6 +15,9 @@
|
||||||
#define PERF_COLOR_CYAN "\033[36m"
|
#define PERF_COLOR_CYAN "\033[36m"
|
||||||
#define PERF_COLOR_BG_RED "\033[41m"
|
#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
|
* This variable stores the value of color.ui
|
||||||
*/
|
*/
|
||||||
|
@ -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(FILE *fp, const char *color, const char *fmt, ...);
|
||||||
int color_fprintf_ln(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 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 */
|
#endif /* COLOR_H */
|
||||||
|
|
Loading…
Reference in New Issue