From c8e17eede52edb0b9a47fa1090b1ed68d9bf2158 Mon Sep 17 00:00:00 2001 From: Ran Benita Date: Thu, 5 Jul 2018 18:13:14 +0300 Subject: bench: simplify the bench helpers Trim the API a bit. Also, just always use gettimeofday(), which is portable. Hopefully the system clock doesn't change while a benchmark is running. Signed-off-by: Ran Benita --- bench/bench.c | 118 ++++++++++-------------------------------------------- bench/bench.h | 25 +++++------- bench/compose.c | 10 ++--- bench/key-proc.c | 14 +++---- bench/rules.c | 10 ++--- bench/rulescomp.c | 10 ++--- 6 files changed, 50 insertions(+), 137 deletions(-) (limited to 'bench') diff --git a/bench/bench.c b/bench/bench.c index 6aa43d9..30889ef 100644 --- a/bench/bench.c +++ b/bench/bench.c @@ -22,130 +22,54 @@ * DEALINGS IN THE SOFTWARE. */ -#if defined(HAVE_CLOCK_GETTIME) -#define USE_CLOCK_GETTIME -#include -#elif defined(__MACH__) && __MACH__ == 1 -#define USE_MACH_ABSOLUTE_TIME -#include -#else -/* gettimeofday() - a last resort */ -#include -#endif - #include -#include -#include -#include #include +#include #include "bench.h" -static void -set_bench_time(struct bench_time *dest, long seconds, long milliseconds) -{ - dest->seconds = seconds; - dest->milliseconds = milliseconds; -} - -static void -normalize_bench_time(struct bench_time *obj) -{ - if (obj->milliseconds >= 0) { - return; - } - obj->milliseconds += 1000000; - obj->seconds--; -} - -void -bench_timer_reset(struct bench_timer *self) -{ -#if defined(USE_MACH_ABSOLUTE_TIME) - mach_timebase_info_data_t info; - if (mach_timebase_info(&info) == 0) { - self->scaling_factor = info.numer / info.denom; - } -#endif - self->start.seconds = 0L; - self->start.milliseconds = 0L; - self->stop.seconds = 0L; - self->stop.milliseconds = 0L; -} - void -bench_timer_start(struct bench_timer *self) +bench_start(struct bench *bench) { -#if defined(USE_CLOCK_GETTIME) - struct timespec val; - - (void) clock_gettime(CLOCK_MONOTONIC, &val); - - /* With conversion from nanosecond to millisecond */ - set_bench_time(&self->start, val.tv_sec, val.tv_nsec / 1000); -#elif defined(USE_MACH_ABSOLUTE_TIME) - uint64_t val; - - val = mach_absolute_time(); - - /* With conversion from nanosecond to millisecond */ - set_bench_time(&self->start, - self->scaling_factor * val / 1000000000, - self->scaling_factor * val % 1000000000 / 1000); -#else struct timeval val; - (void) gettimeofday(&val, NULL); - - set_bench_time(&self->start, val.tv_sec, val.tv_usec); -#endif + bench->start = (struct bench_time) { + .seconds = val.tv_sec, + .microseconds = val.tv_usec, + }; } void -bench_timer_stop(struct bench_timer *self) +bench_stop(struct bench *bench) { -#if defined(USE_CLOCK_GETTIME) - struct timespec val; - - (void) clock_gettime(CLOCK_MONOTONIC, &val); - - /* With conversion from nanosecond to millisecond */ - set_bench_time(&self->stop, val.tv_sec, val.tv_nsec / 1000); -#elif defined(USE_MACH_ABSOLUTE_TIME) - uint64_t val; - - val = mach_absolute_time(); - - /* With conversion from nanosecond to millisecond */ - set_bench_time(&self->stop, - self->scaling_factor * val / 1000000000, - self->scaling_factor * val % 1000000000 / 1000); -#else struct timeval val; - (void) gettimeofday(&val, NULL); - - set_bench_time(&self->stop, val.tv_sec, val.tv_usec); -#endif + bench->stop = (struct bench_time) { + .seconds = val.tv_sec, + .microseconds = val.tv_usec, + }; } void -bench_timer_get_elapsed_time(struct bench_timer *self, struct bench_time *result) +bench_elapsed(const struct bench *bench, struct bench_time *result) { - result->seconds = self->stop.seconds - self->start.seconds; - result->milliseconds = self->stop.milliseconds - self->start.milliseconds; + result->seconds = bench->stop.seconds - bench->start.seconds; + result->microseconds = bench->stop.microseconds - bench->start.microseconds; + if (result->microseconds < 0) { + result->microseconds += 1000000; + result->seconds--; + } } char * -bench_timer_get_elapsed_time_str(struct bench_timer *self) +bench_elapsed_str(const struct bench *bench) { struct bench_time elapsed; char *buf; int ret; - bench_timer_get_elapsed_time(self, &elapsed); - normalize_bench_time(&elapsed); - ret = asprintf(&buf, "%ld.%06ld", elapsed.seconds, elapsed.milliseconds); + bench_elapsed(bench, &elapsed); + ret = asprintf(&buf, "%ld.%06ld", elapsed.seconds, elapsed.microseconds); assert(ret >= 0); return buf; diff --git a/bench/bench.h b/bench/bench.h index adc15bb..facee3d 100644 --- a/bench/bench.h +++ b/bench/bench.h @@ -25,28 +25,25 @@ #ifndef LIBXKBCOMMON_BENCH_H #define LIBXKBCOMMON_BENCH_H -#include - struct bench_time { long seconds; - long milliseconds; + long microseconds; }; -struct bench_timer { +struct bench { struct bench_time start; struct bench_time stop; -#if defined(__MACH__) && __MACH__ == 1 - uint64_t scaling_factor; -#endif }; -void bench_timer_reset(struct bench_timer *self); - -void bench_timer_start(struct bench_timer *self); -void bench_timer_stop(struct bench_timer *self); +void +bench_start(struct bench *bench); +void +bench_stop(struct bench *bench); -void bench_timer_get_elapsed_time(struct bench_timer *self, struct bench_time *result); -/* It's caller's responsibility to release the returned string using free(). */ -char *bench_timer_get_elapsed_time_str(struct bench_timer *self); +void +bench_elapsed(const struct bench *bench, struct bench_time *result); +/* The caller is responsibile to free() the returned string. */ +char * +bench_elapsed_str(const struct bench *bench); #endif /* LIBXKBCOMMON_BENCH_H */ diff --git a/bench/compose.c b/bench/compose.c index e2bf3e0..bb949d8 100644 --- a/bench/compose.c +++ b/bench/compose.c @@ -37,7 +37,7 @@ main(void) char *path; FILE *file; struct xkb_compose_table *table; - struct bench_timer timer; + struct bench bench; char *elapsed; ctx = test_get_context(CONTEXT_NO_FLAG); @@ -55,9 +55,7 @@ main(void) xkb_context_set_log_level(ctx, XKB_LOG_LEVEL_CRITICAL); xkb_context_set_log_verbosity(ctx, 0); - bench_timer_reset(&timer); - - bench_timer_start(&timer); + bench_start(&bench); for (int i = 0; i < BENCHMARK_ITERATIONS; i++) { rewind(file); table = xkb_compose_table_new_from_file(ctx, file, "", @@ -66,12 +64,12 @@ main(void) assert(table); xkb_compose_table_unref(table); } - bench_timer_stop(&timer); + bench_stop(&bench); fclose(file); free(path); - elapsed = bench_timer_get_elapsed_time_str(&timer); + elapsed = bench_elapsed_str(&bench); fprintf(stderr, "compiled %d compose tables in %ss\n", BENCHMARK_ITERATIONS, elapsed); free(elapsed); diff --git a/bench/key-proc.c b/bench/key-proc.c index 56b396a..c09b389 100644 --- a/bench/key-proc.c +++ b/bench/key-proc.c @@ -30,7 +30,7 @@ #define BENCHMARK_ITERATIONS 20000000 static void -bench(struct xkb_state *state) +bench_key_proc(struct xkb_state *state) { int8_t keys[256] = { 0 }; xkb_keycode_t keycode; @@ -57,7 +57,7 @@ main(void) struct xkb_context *ctx; struct xkb_keymap *keymap; struct xkb_state *state; - struct bench_timer timer; + struct bench bench; char *elapsed; ctx = test_get_context(0); @@ -75,13 +75,11 @@ main(void) srand(time(NULL)); - bench_timer_reset(&timer); + bench_start(&bench); + bench_key_proc(state); + bench_stop(&bench); - bench_timer_start(&timer); - bench(state); - bench_timer_stop(&timer); - - elapsed = bench_timer_get_elapsed_time_str(&timer); + elapsed = bench_elapsed_str(&bench); fprintf(stderr, "ran %d iterations in %ss\n", BENCHMARK_ITERATIONS, elapsed); free(elapsed); diff --git a/bench/rules.c b/bench/rules.c index c5d7dc8..751370f 100644 --- a/bench/rules.c +++ b/bench/rules.c @@ -39,7 +39,7 @@ main(int argc, char *argv[]) "evdev", "pc105", "us,il", ",", "ctrl:nocaps,grp:menu_toggle", }; struct xkb_component_names kccgst; - struct bench_timer timer; + struct bench bench; char *elapsed; ctx = test_get_context(0); @@ -48,9 +48,7 @@ main(int argc, char *argv[]) xkb_context_set_log_level(ctx, XKB_LOG_LEVEL_CRITICAL); xkb_context_set_log_verbosity(ctx, 0); - bench_timer_reset(&timer); - - bench_timer_start(&timer); + bench_start(&bench); for (i = 0; i < BENCHMARK_ITERATIONS; i++) { assert(xkb_components_from_rules(ctx, &rmlvo, &kccgst)); free(kccgst.keycodes); @@ -58,9 +56,9 @@ main(int argc, char *argv[]) free(kccgst.compat); free(kccgst.symbols); } - bench_timer_stop(&timer); + bench_stop(&bench); - elapsed = bench_timer_get_elapsed_time_str(&timer); + elapsed = bench_elapsed_str(&bench); fprintf(stderr, "processed %d rule files in %ss\n", BENCHMARK_ITERATIONS, elapsed); free(elapsed); diff --git a/bench/rulescomp.c b/bench/rulescomp.c index 650ccf3..aecb37f 100644 --- a/bench/rulescomp.c +++ b/bench/rulescomp.c @@ -33,7 +33,7 @@ main(int argc, char *argv[]) { struct xkb_context *ctx; struct xkb_keymap *keymap; - struct bench_timer timer; + struct bench bench; char *elapsed; int i; @@ -43,17 +43,15 @@ main(int argc, char *argv[]) xkb_context_set_log_level(ctx, XKB_LOG_LEVEL_CRITICAL); xkb_context_set_log_verbosity(ctx, 0); - bench_timer_reset(&timer); - - bench_timer_start(&timer); + bench_start(&bench); for (i = 0; i < BENCHMARK_ITERATIONS; i++) { keymap = test_compile_rules(ctx, "evdev", "evdev", "us", "", ""); assert(keymap); xkb_keymap_unref(keymap); } - bench_timer_stop(&timer); + bench_stop(&bench); - elapsed = bench_timer_get_elapsed_time_str(&timer); + elapsed = bench_elapsed_str(&bench); fprintf(stderr, "compiled %d keymaps in %ss\n", BENCHMARK_ITERATIONS, elapsed); free(elapsed); -- cgit v1.2.1