libgrapheme

Freestanding C library for unicode string handling
git clone https://git.sinitax.com/suckless/libgrapheme
Log | Files | Refs | README | LICENSE | sfeed.txt

commit e7b4a99ac11124212811a345563e65d199b1fb79
parent 072bb271868a3583da1fe432caa132cbb6c4ce9d
Author: Laslo Hunhold <dev@frign.de>
Date:   Tue,  4 Jan 2022 18:10:09 +0100

Generalize benchmark-function with payload-struct

Signed-off-by: Laslo Hunhold <dev@frign.de>

Diffstat:
Mbenchmark/character.c | 41++++++++++++++++++++++++-----------------
Mbenchmark/util.c | 13++++++-------
Mbenchmark/util.h | 4++--
3 files changed, 32 insertions(+), 26 deletions(-)

diff --git a/benchmark/character.c b/benchmark/character.c @@ -8,61 +8,68 @@ #include "../gen/character-test.h" #include "util.h" -#include <unigbrk.h> #include <utf8proc.h> -#define NUM_ITERATIONS 10000 +#define NUM_ITERATIONS 100000 #if defined __has_attribute #if __has_attribute(optnone) - void libgrapheme(const uint32_t *, size_t) __attribute__((optnone)); - void libutf8proc(const uint32_t *, size_t) __attribute__((optnone)); + void libgrapheme(const void *) __attribute__((optnone)); + void libutf8proc(const void *) __attribute__((optnone)); #endif #endif +struct payload { + uint_least32_t *buf; + size_t bufsiz; +}; + void -libgrapheme(const uint32_t *buf, size_t bufsiz) +libgrapheme(const void *payload) { GRAPHEME_STATE state = { 0 }; + const struct payload *p = payload; size_t i; - for (i = 0; i + 1 < bufsiz; i++) { - (void)grapheme_is_character_break(buf[i], buf[i+1], &state); + for (i = 0; i + 1 < p->bufsiz; i++) { + (void)grapheme_is_character_break(p->buf[i], p->buf[i+1], + &state); } } void -libutf8proc(const uint32_t *buf, size_t bufsiz) +libutf8proc(const void *payload) { utf8proc_int32_t state = 0; + const struct payload *p = payload; size_t i; - for (i = 0; i + 1 < bufsiz; i++) { - (void)utf8proc_grapheme_break_stateful(buf[i], buf[i+1], &state); + for (i = 0; i + 1 < p->bufsiz; i++) { + (void)utf8proc_grapheme_break_stateful(p->buf[i], p->buf[i+1], + &state); } } int main(int argc, char *argv[]) { - size_t bufsiz; - uint32_t *buf; + struct payload p; double baseline = NAN; (void)argc; - if ((buf = generate_test_buffer(character_test, LEN(character_test), - &bufsiz)) == NULL) { + if ((p.buf = generate_test_buffer(character_test, LEN(character_test), + &(p.bufsiz))) == NULL) { return 1; } printf("%s\n", argv[0]); - run_benchmark(libgrapheme, "libgrapheme ", &baseline, buf, bufsiz, + run_benchmark(libgrapheme, &p, "libgrapheme ", &baseline, NUM_ITERATIONS); - run_benchmark(libutf8proc, "libutf8proc ", &baseline, buf, bufsiz, + run_benchmark(libutf8proc, &p, "libutf8proc ", &baseline, NUM_ITERATIONS); - free(buf); + free(p.buf); return 0; } diff --git a/benchmark/util.c b/benchmark/util.c @@ -38,9 +38,8 @@ time_diff(struct timespec *a, struct timespec *b) } void -run_benchmark(void (*func)(const uint32_t *, size_t), const char *name, - double *baseline, const uint32_t *buf, size_t bufsiz, - uint32_t num_iterations) +run_benchmark(void (*func)(const void *), const void *payload, + const char *name, double *baseline, uint32_t num_iterations) { struct timespec start, end; size_t i; @@ -51,7 +50,7 @@ run_benchmark(void (*func)(const uint32_t *, size_t), const char *name, clock_gettime(CLOCK_MONOTONIC, &start); for (i = 0; i < num_iterations; i++) { - func(buf, bufsiz); + func(payload); if (i % (num_iterations / 10) == 0) { printf("."); @@ -59,13 +58,13 @@ run_benchmark(void (*func)(const uint32_t *, size_t), const char *name, } } clock_gettime(CLOCK_MONOTONIC, &end); - diff = time_diff(&start, &end); + diff = time_diff(&start, &end) / num_iterations; if (isnan(*baseline)) { *baseline = diff; - printf(" %.3fs (baseline)\n", diff); + printf(" avg. %.3es (baseline)\n", diff); } else { - printf(" %.3fs (%.2f%% %s)\n", diff, + printf(" avg. %.3es (%.2f%% %s)\n", diff, fabs(1.0 - diff / *baseline) * 100, (diff < *baseline) ? "faster" : "slower"); } diff --git a/benchmark/util.h b/benchmark/util.h @@ -7,7 +7,7 @@ #define LEN(x) (sizeof(x) / sizeof(*(x))) uint32_t *generate_test_buffer(const struct test *, size_t, size_t *); -void run_benchmark(void (*func)(const uint32_t *, size_t), const char *, - double *, const uint32_t *, size_t, uint32_t); +void run_benchmark(void (*func)(const void *), const void *, const char *, + double *, uint32_t); #endif /* UTIL_H */