[gegl] perf: Test gegl:translate fast paths



commit 171e1b9d3204829069ade6aa9fba248a107387d6
Author: Debarshi Ray <debarshir gnome org>
Date:   Fri Dec 18 07:10:31 2015 +0100

    perf: Test gegl:translate fast paths
    
    A "R'G'B' u8" buffer nicely demonstrates all the aspects of the fast
    paths - the buffer shifting trick and avoiding Babl format conversions.
    eg., on a Intel Core i7 it gives a throughput of more than 8000 MB/s,
    and if (needless) Babl conversions are introduced it drops to 1300 to
    1400 MB/s.
    
    On the other hand, a "RGBA float" buffer always performs at 1200 to
    1300 MB/s, whether we avoid the Babl conversions or not. Presumably,
    this is because converting "RGBA float" pixels to "RaGaBaA float" is
    as fast as a NOP.
    
    (The general fall in performance of "RGBA float" buffers is simply
    because they have more bytes than their "R'G'B' u8" counterparts.)
    
    https://bugzilla.gnome.org/show_bug.cgi?id=759616

 perf/Makefile.am      |    4 ++-
 perf/test-translate.c |   56 +++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 59 insertions(+), 1 deletions(-)
---
diff --git a/perf/Makefile.am b/perf/Makefile.am
index b7d4eb7..9106d63 100644
--- a/perf/Makefile.am
+++ b/perf/Makefile.am
@@ -7,7 +7,8 @@ noinst_PROGRAMS = \
        test-bcontrast-4x \
        test-gegl-buffer-access \
        test-samplers \
-       test-rotate
+       test-rotate \
+       test-translate
 
 AM_CPPFLAGS = \
        -I$(top_srcdir)/ \
@@ -34,6 +35,7 @@ check:
        for a in $(noinst_PROGRAMS);do GEGL_PATH=../operations ./$$a;done;true
 
 test_rotate_SOURCES = test-rotate.c
+test_translate_SOURCES = test-translate.c
 test_blur_SOURCES = test-blur.c
 test_bcontrast_SOURCES = test-bcontrast.c
 test_bcontrast_minichunk_SOURCES = test-bcontrast-minichunk.c
diff --git a/perf/test-translate.c b/perf/test-translate.c
new file mode 100644
index 0000000..6527ca7
--- /dev/null
+++ b/perf/test-translate.c
@@ -0,0 +1,56 @@
+#include "test-common.h"
+
+void translate_integer(GeglBuffer *buffer);
+void translate_nearest(GeglBuffer *buffer);
+
+gint
+main (gint    argc,
+      gchar **argv)
+{
+  GeglBuffer *buffer;
+
+  gegl_init (&argc, &argv);
+
+  buffer = test_buffer (1024, 1024, babl_format ("R'G'B' u8"));
+  bench ("translate-integer", buffer, &translate_integer);
+  bench ("translate-nearest", buffer, &translate_nearest);
+
+  return 0;
+}
+
+void translate_integer(GeglBuffer *buffer)
+{
+  GeglBuffer *buffer2;
+  GeglNode   *gegl, *source, *translate, *sink;
+
+  gegl = gegl_node_new ();
+  source = gegl_node_new_child (gegl, "operation", "gegl:buffer-source", "buffer", buffer, NULL);
+  translate = gegl_node_new_child (gegl, "operation", "gegl:translate", "x", 10.0, "y", 10.0, NULL);
+  sink = gegl_node_new_child (gegl, "operation", "gegl:buffer-sink", "buffer", &buffer2, NULL);
+
+  gegl_node_link_many (source, translate, sink, NULL);
+  gegl_node_process (sink);
+  g_object_unref (gegl);
+  g_object_unref (buffer2);
+}
+
+void translate_nearest(GeglBuffer *buffer)
+{
+  GeglBuffer *buffer2;
+  GeglNode   *gegl, *source, *translate, *sink;
+
+  gegl = gegl_node_new ();
+  source = gegl_node_new_child (gegl, "operation", "gegl:buffer-source", "buffer", buffer, NULL);
+  translate = gegl_node_new_child (gegl,
+                                   "operation", "gegl:translate",
+                                   "x", 10.5,
+                                   "y", 10.5,
+                                   "sampler", GEGL_SAMPLER_NEAREST,
+                                   NULL);
+  sink = gegl_node_new_child (gegl, "operation", "gegl:buffer-sink", "buffer", &buffer2, NULL);
+
+  gegl_node_link_many (source, translate, sink, NULL);
+  gegl_node_process (sink);
+  g_object_unref (gegl);
+  g_object_unref (buffer2);
+}


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]