[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