Commit 661cb84051d025d80aad54bce2882762cb28fbe7

Daniel Stone 2012-05-18T00:56:36

Add benchmarking test to rulescomp Apparently it only takes us 8ms to build keymaps. Nice! Signed-off-by: Daniel Stone <daniel@fooishbar.org>

diff --git a/Makefile.am b/Makefile.am
index c3f3b77..274fbcc 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -113,7 +113,7 @@ TESTS_LDADD = libxkbcommon.la
 test_xkey_LDADD = $(TESTS_LDADD)
 test_filecomp_LDADD = $(TESTS_LDADD)
 test_namescomp_LDADD = $(TESTS_LDADD)
-test_rulescomp_LDADD = $(TESTS_LDADD)
+test_rulescomp_LDADD = $(TESTS_LDADD) -lrt
 test_canonicalise_LDADD = $(TESTS_LDADD)
 test_state_LDADD = $(TESTS_LDADD)
 test_context_LDADD = $(TESTS_LDADD)
diff --git a/test/rulescomp.c b/test/rulescomp.c
index fbf335d..ee98f16 100644
--- a/test/rulescomp.c
+++ b/test/rulescomp.c
@@ -26,12 +26,15 @@ authorization from the authors.
 
 #include <assert.h>
 #include <stdio.h>
+#include <time.h>
 
 #include "xkbcommon/xkbcommon.h"
 
+#define BENCHMARK_ITERATIONS 1000
+
 static int
-test_rmlvo(const char *rules, const char *model, const char *layout,
-           const char *variant, const char *options)
+do_test_rmlvo(const char *rules, const char *model, const char *layout,
+              const char *variant, const char *options, int silent)
 {
     struct xkb_context *context;
     struct xkb_keymap *keymap;
@@ -46,8 +49,9 @@ test_rmlvo(const char *rules, const char *model, const char *layout,
     context = xkb_context_new(0);
     assert(context);
 
-    fprintf(stderr, "\nCompiling %s %s %s %s %s\n", rmlvo.rules, rmlvo.model,
-           rmlvo.layout, rmlvo.variant, rmlvo.options);
+    if (!silent)
+        fprintf(stderr, "Compiling %s %s %s %s %s\n", rules, model, layout,
+                variant, options);
 
     keymap = xkb_map_new_from_names(context, &rmlvo, 0);
     if (!keymap) {
@@ -60,8 +64,43 @@ test_rmlvo(const char *rules, const char *model, const char *layout,
     return 1;
 }
 
-int
-main(void)
+static int
+test_rmlvo(const char *rules, const char *model, const char *layout,
+           const char *variant, const char *options)
+{
+    return do_test_rmlvo(rules, model, layout, variant, options, 0);
+}
+
+static int
+test_rmlvo_silent(const char *rules, const char *model, const char *layout,
+                  const char *variant, const char *options)
+{
+    return do_test_rmlvo(rules, model, layout, variant, options, 1);
+}
+
+static void
+benchmark(void)
+{
+    struct timespec start, stop, elapsed;
+    int i;
+
+    clock_gettime(CLOCK_MONOTONIC, &start);
+    for (i = 0; i < BENCHMARK_ITERATIONS; i++)
+        assert(test_rmlvo_silent("base",       "",       "us",  "",      ""));
+    clock_gettime(CLOCK_MONOTONIC, &stop);
+
+    elapsed.tv_sec = stop.tv_sec - start.tv_sec;
+    elapsed.tv_nsec = stop.tv_nsec - start.tv_nsec;
+    if (elapsed.tv_nsec < 0) {
+        elapsed.tv_nsec += 1000000000;
+        elapsed.tv_sec--;
+    }
+
+    fprintf(stderr, "compiled %d keymaps in %ld.%09lds\n",
+            BENCHMARK_ITERATIONS, elapsed.tv_sec, elapsed.tv_nsec);
+}
+
+int main(int argc, char *argv[])
 {
     assert(test_rmlvo("base",       "pc105",  "us,il,ru,ca",  ",,,multix",      "grp:alts_toggle,ctrl:nocaps,compose:rwin"));
     assert(test_rmlvo("base",       "",       "us",  "",      ""));
@@ -73,5 +112,5 @@ main(void)
     assert(!test_rmlvo("base",      "pc105",  "",    "",      ""));
     assert(!test_rmlvo("badrules",  "",       "us",  "",      ""));
 
-    return 0;
+    benchmark();
 }