summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2020-12-07 21:39:59 -0500
committerMatthias Clasen <mclasen@redhat.com>2020-12-22 09:54:47 -0500
commitd67b40f77d467cbee10e5350ceed42663d670b7a (patch)
tree155cf39619a2109ce0d6ca1e7bce4ff53c8dc594
parentfa9bb820403dfd81252305a884e105390607e668 (diff)
downloadgtk+-d67b40f77d467cbee10e5350ceed42663d670b7a.tar.gz
Add a performance test for curve intersection
This shows how much more expensive curve intersections are.
-rw-r--r--testsuite/gsk/curve-performance.c135
-rw-r--r--testsuite/gsk/meson.build1
2 files changed, 136 insertions, 0 deletions
diff --git a/testsuite/gsk/curve-performance.c b/testsuite/gsk/curve-performance.c
new file mode 100644
index 0000000000..d2d4aae68a
--- /dev/null
+++ b/testsuite/gsk/curve-performance.c
@@ -0,0 +1,135 @@
+#include <gtk/gtk.h>
+#include "gsk/gskcurveprivate.h"
+
+static void
+init_random_point (graphene_point_t *p)
+{
+ p->x = g_test_rand_double_range (0, 1000);
+ p->y = g_test_rand_double_range (0, 1000);
+}
+
+static void
+init_random_curve_with_op (GskCurve *curve,
+ GskPathOperation min_op,
+ GskPathOperation max_op)
+{
+ switch (g_test_rand_int_range (min_op, max_op + 1))
+ {
+ case GSK_PATH_LINE:
+ {
+ graphene_point_t p[2];
+
+ init_random_point (&p[0]);
+ init_random_point (&p[1]);
+ gsk_curve_init (curve, gsk_pathop_encode (GSK_PATH_LINE, p));
+ }
+ break;
+
+ case GSK_PATH_CURVE:
+ {
+ graphene_point_t p[4];
+
+ init_random_point (&p[0]);
+ init_random_point (&p[1]);
+ init_random_point (&p[2]);
+ init_random_point (&p[3]);
+ gsk_curve_init (curve, gsk_pathop_encode (GSK_PATH_CURVE, p));
+ }
+ break;
+
+ case GSK_PATH_CONIC:
+ {
+ graphene_point_t p[4];
+
+ init_random_point (&p[0]);
+ init_random_point (&p[1]);
+ p[2] = GRAPHENE_POINT_INIT (g_test_rand_double_range (0, 20), 0);
+ init_random_point (&p[3]);
+ gsk_curve_init (curve, gsk_pathop_encode (GSK_PATH_CONIC, p));
+ }
+ break;
+
+ default:
+ g_assert_not_reached ();
+ }
+}
+
+static void
+test_intersection (GskPathOperation op1,
+ GskPathOperation op2)
+{
+ GskCurve curves[10000];
+ GskCurve *c1, *c2;
+ gint64 start, time;
+ gint64 count;
+ double time_elapsed;
+ double result;
+ float t1[9], t2[9];
+ graphene_point_t p[9];
+
+ for (int i = 0; i < 5000; i++)
+ {
+ init_random_curve_with_op (&curves[i], op1, op1);
+ init_random_curve_with_op (&curves[5000 + i], op2, op2);
+ }
+
+ count = 0;
+ start = time = g_get_monotonic_time ();
+
+ while (time - start < G_TIME_SPAN_SECOND * 20)
+ {
+ c1 = &curves[g_test_rand_int_range (0, 5000)];
+ c2 = &curves[g_test_rand_int_range (5000, 10000)];
+
+ gsk_curve_intersect (c1, c2, t1, t2, p, 9);
+
+ count++;
+ if (count % 10000 == 0)
+ time = g_get_monotonic_time ();
+ }
+
+ time_elapsed = (time - start) / (double) G_TIME_SPAN_SECOND;
+ result = ((double) count / time_elapsed);
+ g_test_maximized_result (result, "%8.1f ops/s", result);
+}
+
+static void
+line_intersection (void)
+{
+ test_intersection (GSK_PATH_LINE, GSK_PATH_LINE);
+}
+
+static void
+line_curve_intersection (void)
+{
+ test_intersection (GSK_PATH_LINE, GSK_PATH_CURVE);
+}
+
+static void
+curve_intersection (void)
+{
+ test_intersection (GSK_PATH_CURVE, GSK_PATH_CURVE);
+}
+
+static void
+conic_intersection (void)
+{
+ test_intersection (GSK_PATH_CONIC, GSK_PATH_CONIC);
+}
+
+int
+main (int argc, char *argv[])
+{
+ g_test_init (&argc, &argv, NULL);
+
+ if (g_test_perf ())
+ {
+ g_test_add_func ("/curve/perf/intersection/line", line_intersection);
+ g_test_add_func ("/curve/perf/intersection/line-curve", line_curve_intersection);
+ g_test_add_func ("/curve/perf/intersection/curve", curve_intersection);
+ g_test_add_func ("/curve/perf/intersection/conic", conic_intersection);
+ }
+
+ return g_test_run ();
+}
+
diff --git a/testsuite/gsk/meson.build b/testsuite/gsk/meson.build
index c2fd5b848b..2efe5f70ed 100644
--- a/testsuite/gsk/meson.build
+++ b/testsuite/gsk/meson.build
@@ -196,6 +196,7 @@ tests = [
['curve', ['../../gsk/gskcurve.c', '../../gsk/gskcurveintersect.c'], ['-DGTK_COMPILATION']],
['curve-special-cases', ['../../gsk/gskcurve.c'], ['-DGTK_COMPILATION']],
['dash'],
+ ['curve-performance', ['../../gsk/gskcurve.c', '../../gsk/gskcurveintersect.c'], ['-DGTK_COMPILATION']],
['path'],
['path-special-cases'],
['rounded-rect'],