diff options
Diffstat (limited to 'perf/cairo-perf-print.c')
-rw-r--r-- | perf/cairo-perf-print.c | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/perf/cairo-perf-print.c b/perf/cairo-perf-print.c new file mode 100644 index 000000000..d7ae1311e --- /dev/null +++ b/perf/cairo-perf-print.c @@ -0,0 +1,139 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * Copyright © 2009 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of the + * copyright holders not be used in advertising or publicity + * pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied + * warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY + * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN + * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + * + * Authors: Carl Worth <cworth@cworth.org> + * Chris Wilson <chris@chris-wilson.co.uk> + */ + +#if HAVE_CONFIG_H +#include "config.h" +#endif + +#include "cairo-perf.h" +#include "cairo-stats.h" + +#include <stdio.h> + +#if HAVE_UNISTD_H && HAVE_SYS_IOCTL_H +#define USE_TERMINAL_SIZE 1 +#else +#define USE_TERMINAL_SIZE 0 +#endif + +#if USE_TERMINAL_SIZE +#include <unistd.h> +#include <sys/ioctl.h> +#endif + +static void +report_print (const cairo_perf_report_t *report, + int show_histogram) +{ + const test_report_t *test; + cairo_histogram_t h; + + if (show_histogram) { + int num_rows = 23; + int num_cols = 80; + +#if USE_TERMINAL_SIZE + int fd = fileno(stdout); + if (isatty(fd)) { + struct winsize ws; + + if(ioctl(fd, TIOCGWINSZ, &ws) == 0 ) { + num_rows = ws.ws_row - 1; + num_cols = ws.ws_col; + } + } +#endif + + if (!_cairo_histogram_init (&h, num_cols, num_rows)) + show_histogram = 0; + } + + for (test = report->tests; test->name != NULL; test++) { + if (test->stats.iterations == 0) + continue; + + if (show_histogram) { + const cairo_time_t *values; + int num_values; + + if (show_histogram > 1) { + values = test->stats.values; + num_values = test->stats.iterations; + } else { + values = test->samples; + num_values = test->samples_count; + } + + if (_cairo_histogram_compute (&h, values, num_values)) + _cairo_histogram_printf (&h, stdout); + } + + if (test->size) { + printf ("%5s-%-4s %26s-%-3d ", + test->backend, test->content, + test->name, test->size); + } else { + printf ("%5s %26s ", test->backend, test->name); + } + printf("%6.2f %4.2f%% (%d/%d)\n", + test->stats.median_ticks / test->stats.ticks_per_ms, + test->stats.std_dev * 100, + test->stats.iterations, test->samples_count); + } + + if (show_histogram) + _cairo_histogram_fini (&h); +} + +int +main (int argc, + const char *argv[]) +{ + cairo_bool_t show_histogram = 0; + int i; + + for (i = 1; i < argc; i++ ) { + cairo_perf_report_t report; + + if (strcmp(argv[i], "--histogram") == 0) { + show_histogram = 1; + continue; + } + + if (strcmp(argv[i], "--short-histogram") == 0) { + show_histogram = 2; + continue; + } + + cairo_perf_report_load (&report, argv[i], i, NULL); + report_print (&report, show_histogram); + } + + return 0; +} |