diff options
author | Frederic Weisbecker <fweisbec@gmail.com> | 2009-07-02 14:14:34 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-07-02 15:38:37 -0400 |
commit | 1e11fd82d247e4e48a1d6c49402214434538d3fd (patch) | |
tree | 7ac435b0be559c113987a64126559ea9b41627dc | |
parent | c20ab37ef30f4a874cf27e84c12c73e584e6f5cc (diff) |
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>
-rw-r--r-- | tools/perf/builtin-annotate.c | 26 | ||||
-rw-r--r-- | tools/perf/builtin-report.c | 21 | ||||
-rw-r--r-- | tools/perf/builtin-top.c | 15 | ||||
-rw-r--r-- | tools/perf/util/color.c | 27 | ||||
-rw-r--r-- | tools/perf/util/color.h | 5 |
5 files changed, 38 insertions, 56 deletions
diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c index 08ea6c5329d9..5f9eefecc574 100644 --- a/tools/perf/builtin-annotate.c +++ b/tools/perf/builtin-annotate.c | |||
@@ -25,10 +25,6 @@ | |||
25 | #define SHOW_USER 2 | 25 | #define SHOW_USER 2 |
26 | #define SHOW_HV 4 | 26 | #define SHOW_HV 4 |
27 | 27 | ||
28 | #define MIN_GREEN 0.5 | ||
29 | #define MIN_RED 5.0 | ||
30 | |||
31 | |||
32 | static char const *input_name = "perf.data"; | 28 | static char const *input_name = "perf.data"; |
33 | static char *vmlinux = "vmlinux"; | 29 | static char *vmlinux = "vmlinux"; |
34 | 30 | ||
@@ -1047,24 +1043,6 @@ process_event(event_t *event, unsigned long offset, unsigned long head) | |||
1047 | return 0; | 1043 | return 0; |
1048 | } | 1044 | } |
1049 | 1045 | ||
1050 | static char *get_color(double percent) | ||
1051 | { | ||
1052 | char *color = PERF_COLOR_NORMAL; | ||
1053 | |||
1054 | /* | ||
1055 | * We color high-overhead entries in red, mid-overhead | ||
1056 | * entries in green - and keep the low overhead places | ||
1057 | * normal: | ||
1058 | */ | ||
1059 | if (percent >= MIN_RED) | ||
1060 | color = PERF_COLOR_RED; | ||
1061 | else { | ||
1062 | if (percent > MIN_GREEN) | ||
1063 | color = PERF_COLOR_GREEN; | ||
1064 | } | ||
1065 | return color; | ||
1066 | } | ||
1067 | |||
1068 | static int | 1046 | static int |
1069 | parse_line(FILE *file, struct symbol *sym, u64 start, u64 len) | 1047 | parse_line(FILE *file, struct symbol *sym, u64 start, u64 len) |
1070 | { | 1048 | { |
@@ -1126,7 +1104,7 @@ parse_line(FILE *file, struct symbol *sym, u64 start, u64 len) | |||
1126 | } else if (sym->hist_sum) | 1104 | } else if (sym->hist_sum) |
1127 | percent = 100.0 * hits / sym->hist_sum; | 1105 | percent = 100.0 * hits / sym->hist_sum; |
1128 | 1106 | ||
1129 | color = get_color(percent); | 1107 | color = get_percent_color(percent); |
1130 | 1108 | ||
1131 | /* | 1109 | /* |
1132 | * Also color the filename and line if needed, with | 1110 | * Also color the filename and line if needed, with |
@@ -1262,7 +1240,7 @@ static void print_summary(char *filename) | |||
1262 | 1240 | ||
1263 | sym_ext = rb_entry(node, struct sym_ext, node); | 1241 | sym_ext = rb_entry(node, struct sym_ext, node); |
1264 | percent = sym_ext->percent; | 1242 | percent = sym_ext->percent; |
1265 | color = get_color(percent); | 1243 | color = get_percent_color(percent); |
1266 | path = sym_ext->path; | 1244 | path = sym_ext->path; |
1267 | 1245 | ||
1268 | color_fprintf(stdout, color, " %7.2f %s", percent, path); | 1246 | color_fprintf(stdout, color, " %7.2f %s", percent, path); |
diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c index e8c98179fe45..c9dbe3315497 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c | |||
@@ -947,25 +947,10 @@ hist_entry__fprintf(FILE *fp, struct hist_entry *self, u64 total_samples) | |||
947 | if (exclude_other && !self->parent) | 947 | if (exclude_other && !self->parent) |
948 | return 0; | 948 | return 0; |
949 | 949 | ||
950 | if (total_samples) { | 950 | if (total_samples) |
951 | double percent = self->count * 100.0 / total_samples; | 951 | ret = percent_color_fprintf(fp, " %6.2f%%", |
952 | char *color = PERF_COLOR_NORMAL; | ||
953 | |||
954 | /* | ||
955 | * We color high-overhead entries in red, mid-overhead | ||
956 | * entries in green - and keep the low overhead places | ||
957 | * normal: | ||
958 | */ | ||
959 | if (percent >= 5.0) { | ||
960 | color = PERF_COLOR_RED; | ||
961 | } else { | ||
962 | if (percent >= 0.5) | ||
963 | color = PERF_COLOR_GREEN; | ||
964 | } | ||
965 | |||
966 | ret = color_fprintf(fp, color, " %6.2f%%", | ||
967 | (self->count * 100.0) / total_samples); | 952 | (self->count * 100.0) / total_samples); |
968 | } else | 953 | else |
969 | ret = fprintf(fp, "%12Ld ", self->count); | 954 | ret = fprintf(fp, "%12Ld ", self->count); |
970 | 955 | ||
971 | list_for_each_entry(se, &hist_entry__sort_list, list) { | 956 | list_for_each_entry(se, &hist_entry__sort_list, list) { |
diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c index aa044ea1482b..95d5c0ae375a 100644 --- a/tools/perf/builtin-top.c +++ b/tools/perf/builtin-top.c | |||
@@ -239,7 +239,6 @@ static void print_sym_table(void) | |||
239 | for (nd = rb_first(&tmp); nd; nd = rb_next(nd)) { | 239 | for (nd = rb_first(&tmp); nd; nd = rb_next(nd)) { |
240 | struct sym_entry *syme = rb_entry(nd, struct sym_entry, rb_node); | 240 | struct sym_entry *syme = rb_entry(nd, struct sym_entry, rb_node); |
241 | struct symbol *sym = (struct symbol *)(syme + 1); | 241 | struct symbol *sym = (struct symbol *)(syme + 1); |
242 | char *color = PERF_COLOR_NORMAL; | ||
243 | double pcnt; | 242 | double pcnt; |
244 | 243 | ||
245 | if (++printed > print_entries || syme->snap_count < count_filter) | 244 | if (++printed > print_entries || syme->snap_count < count_filter) |
@@ -248,24 +247,12 @@ static void print_sym_table(void) | |||
248 | pcnt = 100.0 - (100.0 * ((sum_ksamples - syme->snap_count) / | 247 | pcnt = 100.0 - (100.0 * ((sum_ksamples - syme->snap_count) / |
249 | sum_ksamples)); | 248 | sum_ksamples)); |
250 | 249 | ||
251 | /* | ||
252 | * We color high-overhead entries in red, mid-overhead | ||
253 | * entries in green - and keep the low overhead places | ||
254 | * normal: | ||
255 | */ | ||
256 | if (pcnt >= 5.0) { | ||
257 | color = PERF_COLOR_RED; | ||
258 | } else { | ||
259 | if (pcnt >= 0.5) | ||
260 | color = PERF_COLOR_GREEN; | ||
261 | } | ||
262 | |||
263 | if (nr_counters == 1) | 250 | if (nr_counters == 1) |
264 | printf("%20.2f - ", syme->weight); | 251 | printf("%20.2f - ", syme->weight); |
265 | else | 252 | else |
266 | printf("%9.1f %10ld - ", syme->weight, syme->snap_count); | 253 | printf("%9.1f %10ld - ", syme->weight, syme->snap_count); |
267 | 254 | ||
268 | color_fprintf(stdout, color, "%4.1f%%", pcnt); | 255 | percent_color_fprintf(stdout, "%4.1f%%", pcnt); |
269 | printf(" - %016llx : %s", sym->start, sym->name); | 256 | printf(" - %016llx : %s", sym->start, sym->name); |
270 | if (sym->module) | 257 | if (sym->module) |
271 | printf("\t[%s]", sym->module->name); | 258 | printf("\t[%s]", sym->module->name); |
diff --git a/tools/perf/util/color.c b/tools/perf/util/color.c index 26f82318b86b..90a044d1fe7d 100644 --- a/tools/perf/util/color.c +++ b/tools/perf/util/color.c | |||
@@ -242,4 +242,31 @@ int color_fwrite_lines(FILE *fp, const char *color, | |||
242 | return 0; | 242 | return 0; |
243 | } | 243 | } |
244 | 244 | ||
245 | char *get_percent_color(double percent) | ||
246 | { | ||
247 | char *color = PERF_COLOR_NORMAL; | ||
248 | |||
249 | /* | ||
250 | * We color high-overhead entries in red, mid-overhead | ||
251 | * entries in green - and keep the low overhead places | ||
252 | * normal: | ||
253 | */ | ||
254 | if (percent >= MIN_RED) | ||
255 | color = PERF_COLOR_RED; | ||
256 | else { | ||
257 | if (percent > MIN_GREEN) | ||
258 | color = PERF_COLOR_GREEN; | ||
259 | } | ||
260 | return color; | ||
261 | } | ||
245 | 262 | ||
263 | int percent_color_fprintf(FILE *fp, const char *fmt, double percent) | ||
264 | { | ||
265 | int r; | ||
266 | char *color; | ||
267 | |||
268 | color = get_percent_color(percent); | ||
269 | r = color_fprintf(fp, color, fmt, percent); | ||
270 | |||
271 | return r; | ||
272 | } | ||
diff --git a/tools/perf/util/color.h b/tools/perf/util/color.h index 5abfd379582b..706cec50bd25 100644 --- a/tools/perf/util/color.h +++ b/tools/perf/util/color.h | |||
@@ -15,6 +15,9 @@ | |||
15 | #define PERF_COLOR_CYAN "\033[36m" | 15 | #define PERF_COLOR_CYAN "\033[36m" |
16 | #define PERF_COLOR_BG_RED "\033[41m" | 16 | #define PERF_COLOR_BG_RED "\033[41m" |
17 | 17 | ||
18 | #define MIN_GREEN 0.5 | ||
19 | #define MIN_RED 5.0 | ||
20 | |||
18 | /* | 21 | /* |
19 | * This variable stores the value of color.ui | 22 | * This variable stores the value of color.ui |
20 | */ | 23 | */ |
@@ -32,5 +35,7 @@ void color_parse_mem(const char *value, int len, const char *var, char *dst); | |||
32 | int color_fprintf(FILE *fp, const char *color, const char *fmt, ...); | 35 | int color_fprintf(FILE *fp, const char *color, const char *fmt, ...); |
33 | int color_fprintf_ln(FILE *fp, const char *color, const char *fmt, ...); | 36 | int color_fprintf_ln(FILE *fp, const char *color, const char *fmt, ...); |
34 | int color_fwrite_lines(FILE *fp, const char *color, size_t count, const char *buf); | 37 | int color_fwrite_lines(FILE *fp, const char *color, size_t count, const char *buf); |
38 | int percent_color_fprintf(FILE *fp, const char *fmt, double percent); | ||
39 | char *get_percent_color(double percent); | ||
35 | 40 | ||
36 | #endif /* COLOR_H */ | 41 | #endif /* COLOR_H */ |