summaryrefslogtreecommitdiff
path: root/perf/cairo-perf-diff-files.c
diff options
context:
space:
mode:
Diffstat (limited to 'perf/cairo-perf-diff-files.c')
-rw-r--r--perf/cairo-perf-diff-files.c112
1 files changed, 103 insertions, 9 deletions
diff --git a/perf/cairo-perf-diff-files.c b/perf/cairo-perf-diff-files.c
index 2bad7d98..d534fb7d 100644
--- a/perf/cairo-perf-diff-files.c
+++ b/perf/cairo-perf-diff-files.c
@@ -444,6 +444,29 @@ cairo_perf_report_load (cairo_perf_report_t *report, const char *filename)
}
static int
+test_diff_cmp_speedup_before_slowdown (const void *a, const void *b)
+{
+ const test_diff_t *a_diff = a;
+ const test_diff_t *b_diff = b;
+
+ /* First make all speedups come before all slowdowns. */
+ if (a_diff->change > 1.0 && b_diff->change < 1.0)
+ return -1;
+ if (a_diff->change < 1.0 && b_diff->change > 1.0)
+ return 1;
+
+ /* Reverse sort by magnitude of change so larger changes come
+ * first */
+ if (fabs (a_diff->change) > fabs (b_diff->change))
+ return -1;
+
+ if (fabs (a_diff->change) < fabs (b_diff->change))
+ return 1;
+
+ return 0;
+}
+
+static int
test_diff_cmp (const void *a, const void *b)
{
const test_diff_t *a_diff = a;
@@ -507,9 +530,33 @@ print_change_bar (double change, double max_change, int use_utf)
}
static void
-test_diff_print (test_diff_t *diff,
- double max_change,
- cairo_perf_report_options_t *options)
+test_diff_print_binary (test_diff_t *diff,
+ double max_change,
+ cairo_perf_report_options_t *options)
+{
+ printf ("%5s-%-4s %26s-%-3d %6.2f %4.2f%% -> %6.2f %4.2f%%: %5.2fx ",
+ diff->tests[0]->backend, diff->tests[0]->content,
+ diff->tests[0]->name, diff->tests[0]->size,
+ diff->tests[0]->stats.median_ticks / diff->tests[0]->stats.ticks_per_ms,
+ diff->tests[0]->stats.std_dev * 100,
+ diff->tests[1]->stats.median_ticks / diff->tests[1]->stats.ticks_per_ms,
+ diff->tests[1]->stats.std_dev * 100,
+ fabs (diff->change));
+
+ if (diff->change > 1.0)
+ printf ("speedup\n");
+ else
+ printf ("slowdown\n");
+
+ if (options->print_change_bars)
+ print_change_bar (fabs (diff->change), max_change,
+ options->use_utf);
+}
+
+static void
+test_diff_print_multi (test_diff_t *diff,
+ double max_change,
+ cairo_perf_report_options_t *options)
{
int i;
double test_time;
@@ -551,6 +598,8 @@ cairo_perf_reports_compare (cairo_perf_report_t *reports,
double max_change;
double test_time;
cairo_bool_t seen_non_null;
+ cairo_bool_t printed_speedup = FALSE;
+ cairo_bool_t printed_slowdown = FALSE;
assert (num_reports >= 2);
@@ -613,16 +662,41 @@ cairo_perf_reports_compare (cairo_perf_report_t *reports,
}
diff->change = diff->max / diff->min;
+ if (num_reports == 2) {
+ double old_time, new_time;
+ if (diff->num_tests == 1) {
+ printf ("Only in %s: %s %s\n",
+ diff->tests[0]->configuration,
+ diff->tests[0]->backend,
+ diff->tests[0]->name);
+ continue;
+ }
+ old_time = diff->tests[0]->stats.min_ticks;
+ new_time = diff->tests[1]->stats.min_ticks;
+ if (options->use_ms) {
+ old_time /= diff->tests[0]->stats.ticks_per_ms;
+ new_time /= diff->tests[1]->stats.ticks_per_ms;
+ }
+ diff->change = old_time / new_time;
+ if (diff->change < 1.0)
+ diff->change = - 1.0 / diff->change;
+ }
+
diff++;
num_diffs++;
}
- qsort (diffs, num_diffs, sizeof (test_diff_t), test_diff_cmp);
+ if (num_reports == 2)
+ qsort (diffs, num_diffs, sizeof (test_diff_t),
+ test_diff_cmp_speedup_before_slowdown);
+ else
+ qsort (diffs, num_diffs, sizeof (test_diff_t), test_diff_cmp);
max_change = 1.0;
- for (i = 0; i < num_diffs; i++)
- if (diffs[i].change > max_change)
- max_change = diffs[i].change;
+ for (i = 0; i < num_diffs; i++) {
+ if (fabs (diffs[i].change) > max_change)
+ max_change = fabs (diffs[i].change);
+ }
for (i = 0; i < num_diffs; i++) {
diff = &diffs[i];
@@ -630,10 +704,30 @@ cairo_perf_reports_compare (cairo_perf_report_t *reports,
/* Discard as uninteresting a change which is less than the
* minimum change required, (default may be overriden on
* command-line). */
- if (diff->change - 1.0 < options->min_change)
+ if (fabs (diff->change) - 1.0 < options->min_change)
continue;
- test_diff_print (diff, max_change, options);
+ if (num_reports == 2) {
+ if (i == 0) {
+ printf ("old: %s\n"
+ "new: %s\n",
+ diffs->tests[0]->configuration,
+ diffs->tests[1]->configuration);
+ }
+ if (diff->change > 1.0 && ! printed_speedup) {
+ printf ("Speedups\n"
+ "========\n");
+ printed_speedup = TRUE;
+ }
+ if (diff->change < 1.0 && ! printed_slowdown) {
+ printf ("Slowdowns\n"
+ "=========\n");
+ printed_slowdown = TRUE;
+ }
+ test_diff_print_binary (diff, max_change, options);
+ } else {
+ test_diff_print_multi (diff, max_change, options);
+ }
}
for (i = 0; i < num_diffs; i++)