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:
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 */