[cairo] Cairo 1.3 performance loss

Daniel Amelang daniel.amelang at gmail.com
Wed Jan 31 11:42:34 PST 2007


On 1/31/07, Carl Worth <cworth at cworth.org> wrote:
> On Wed, 31 Jan 2007 18:00:49 +0200, Jorn Baayen wrote:
> > Still, it would be interesting to see what adding a rectangle primitive
> > does, as the tessellate function in 1.3.12 does get called more than the
> > one in 1.2.4. Also the data seems to suggest that filling rectangles is
> > slightly faster using 1.2.4 than using 1.3.x.
>
> Yeah, we can add a test that fills a lot of small pixel-aligned
> rectangles, (one at a time?), and see what cairo-perf-diff says about
> that from 1.2.4 through recent 1.3.x snapshots.

I've got a perf test laying around that I made back in the days I was
working on the matrix optimizations (cairo_rectangle calls
user_to_backend and user_to_device_distance several times).

If it's what you're looking for, just say the word and I'll push it.

Dan
-------------- next part --------------
From 9aa60355ab643b597521757610cf6e093551f079 Mon Sep 17 00:00:00 2001
From: Dan Amelang <dan at amelang.net>
Date: Wed, 31 Jan 2007 11:34:38 -0800
Subject: [PATCH] Add "rectangles" perf test

This test draws many small, solid pixel-aligned rectangles one at a time.
---
 perf/Makefile.am  |    1 +
 perf/cairo-perf.c |    1 +
 perf/cairo-perf.h |    1 +
 perf/rectangles.c |   71 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 74 insertions(+), 0 deletions(-)

diff --git a/perf/Makefile.am b/perf/Makefile.am
index 1ed4c81..a50ce8a 100644
--- a/perf/Makefile.am
+++ b/perf/Makefile.am
@@ -26,6 +26,7 @@ cairo_perf_SOURCES =		\
 	mosaic.h		\
 	paint.c			\
 	pattern_create_radial.c \
+	rectangles.c		\
 	stroke.c		\
 	subimage_copy.c		\
 	tessellate.c		\
diff --git a/perf/cairo-perf.c b/perf/cairo-perf.c
index 18cc652..c25b3d4 100644
--- a/perf/cairo-perf.c
+++ b/perf/cairo-perf.c
@@ -329,5 +329,6 @@ cairo_perf_case_t perf_cases[] = {
     { mosaic, 800, 800 },
     { long_lines, 100, 100},
     { unaligned_clip, 100, 100},
+    { rectangles, 512, 512},
     { NULL }
 };
diff --git a/perf/cairo-perf.h b/perf/cairo-perf.h
index 1ef9600..1fef997 100644
--- a/perf/cairo-perf.h
+++ b/perf/cairo-perf.h
@@ -105,5 +105,6 @@ CAIRO_PERF_DECL (box_outline);
 CAIRO_PERF_DECL (mosaic);
 CAIRO_PERF_DECL (long_lines);
 CAIRO_PERF_DECL (unaligned_clip);
+CAIRO_PERF_DECL (rectangles);
 
 #endif
diff --git a/perf/rectangles.c b/perf/rectangles.c
new file mode 100644
index 0000000..9fa89f5
--- /dev/null
+++ b/perf/rectangles.c
@@ -0,0 +1,71 @@
+/*
+ * Copyright ?? 2006 Dan Amelang
+ *
+ * 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 authors not be used in advertising or publicity pertaining to
+ * distribution of the software without specific, written prior
+ * permission. The authors make no representations about the
+ * suitability of this software for any purpose.  It is provided "as
+ * is" without express or implied warranty.
+ *
+ * THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
+ * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS, IN NO EVENT SHALL THE AUTHORS 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: Dan Amelang <dan at amelang.net>
+ */
+#include "cairo-perf.h"
+
+#define RECTANGLE_COUNT (1000)
+
+static struct
+{
+    double x;
+    double y;
+    double width;
+    double height;
+} rects[RECTANGLE_COUNT];
+
+static cairo_perf_ticks_t
+do_rectangles (cairo_t *cr, int width, int height)
+{
+    int i;
+
+    cairo_perf_timer_start ();
+
+    for (i = 0; i < RECTANGLE_COUNT; i++)
+    {
+        cairo_rectangle (cr, rects[i].x, rects[i].y,
+                             rects[i].width, rects[i].height);
+        cairo_fill (cr);
+    }
+
+    cairo_perf_timer_stop ();
+
+    return cairo_perf_timer_elapsed ();
+}
+
+void
+rectangles (cairo_perf_t *perf, cairo_t *cr, int width, int height)
+{
+    int i;
+
+    srand (8478232);
+    for (i = 0; i < RECTANGLE_COUNT; i++)
+    {
+        rects[i].x = rand () % width;
+        rects[i].y = rand () % height;
+        rects[i].width  = (rand () % (width / 10)) + 1;
+        rects[i].height = (rand () % (height / 10)) + 1;
+    }
+
+    cairo_perf_run (perf, "rectangles", do_rectangles);
+}
-- 
1.4.4.2


More information about the cairo mailing list