Add benchmarking test to rulescomp Apparently it only takes us 8ms to build keymaps. Nice! Signed-off-by: Daniel Stone <daniel@fooishbar.org>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
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();
}