| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- /*
- * Copyright © 2023 Pierre Le Marre
- * SPDX-License-Identifier: MIT
- */
- #include "config.h"
- #include <time.h>
- #include <stdbool.h>
- #include "xkbcommon/xkbcommon.h"
- #include "src/keysym.h"
- #include "../test/test.h"
- #include "bench.h"
- #define BENCHMARK_ITERATIONS 300
- typedef uint32_t (*CaseMappingFunc)(xkb_keysym_t ks);
- typedef bool (*CaseTestFunc)(xkb_keysym_t ks);
- struct TestedFunction {
- union {
- struct {
- CaseMappingFunc toLower;
- CaseMappingFunc toUpper;
- };
- struct {
- CaseTestFunc isLower;
- CaseTestFunc isUpper;
- };
- };
- const char *name;
- };
- static const struct TestedFunction functions[] = {
- { {.toLower = xkb_keysym_to_lower, .toUpper = xkb_keysym_to_upper},
- "to_lower & to_upper" },
- { {.isLower = xkb_keysym_is_lower, .isUpper = xkb_keysym_is_upper_or_title},
- "is_lower & is_upper" },
- };
- int
- main(void)
- {
- struct bench bench;
- for (size_t f = 0; f < ARRAY_SIZE(functions); f++) {
- for (int explicit = 1; explicit >= 0; explicit--) {
- fprintf(stderr, "Benchmarking %s...\n", functions[f].name);
- bench_start(&bench);
- for (int i = 0; i < BENCHMARK_ITERATIONS; i++) {
- struct xkb_keysym_iterator *iter = xkb_keysym_iterator_new(explicit);
- while (xkb_keysym_iterator_next(iter)) {
- xkb_keysym_t ks = xkb_keysym_iterator_get_keysym(iter);
- functions[f].toLower(ks);
- functions[f].toUpper(ks);
- }
- /* Avoid dangling pointers
- * NOLINTNEXTLINE(clang-analyzer-deadcode.DeadStores) */
- iter = xkb_keysym_iterator_unref(iter);
- }
- bench_stop(&bench);
- char *elapsed = bench_elapsed_str(&bench);
- fprintf(stderr,
- "Applied %d times \"%s\" to %s assigned keysyms in %ss\n",
- BENCHMARK_ITERATIONS, functions[f].name, explicit ? "explicitly" : "all", elapsed);
- free(elapsed);
- }
- }
- return 0;
- }
|