Introduction
Introduction Statistics Contact Development Disclaimer Help
util.c - libgrapheme - unicode string library
git clone git://git.suckless.org/libgrapheme
Log
Files
Refs
README
LICENSE
---
util.c (2703B)
---
1 /* See LICENSE file for copyright and license details. */
2 #include <math.h>
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <time.h>
6
7 #include "../gen/types.h"
8 #include "../grapheme.h"
9 #include "util.h"
10
11 uint_least32_t *
12 generate_cp_test_buffer(const struct break_test *test, size_t testlen,
13 size_t *buflen)
14 {
15 size_t i, j, off;
16 uint_least32_t *buf;
17
18 /* allocate and generate buffer */
19 for (i = 0, *buflen = 0; i < testlen; i++) {
20 *buflen += test[i].cplen;
21 }
22 if (!(buf = calloc(*buflen, sizeof(*buf)))) {
23 fprintf(stderr,
24 "generate_test_buffer: calloc: Out of memory.\n"…
25 exit(1);
26 }
27 for (i = 0, off = 0; i < testlen; i++) {
28 for (j = 0; j < test[i].cplen; j++) {
29 buf[off + j] = test[i].cp[j];
30 }
31 off += test[i].cplen;
32 }
33
34 return buf;
35 }
36
37 char *
38 generate_utf8_test_buffer(const struct break_test *test, size_t testlen,
39 size_t *buflen)
40 {
41 size_t i, j, off, ret;
42 char *buf;
43
44 /* allocate and generate buffer */
45 for (i = 0, *buflen = 0; i < testlen; i++) {
46 for (j = 0; j < test[i].cplen; j++) {
47 *buflen += grapheme_encode_utf8(test[i].cp[j], N…
48 }
49 }
50 (*buflen)++; /* terminating NUL-byte */
51 if (!(buf = malloc(*buflen))) {
52 fprintf(stderr,
53 "generate_test_buffer: malloc: Out of memory.\n"…
54 exit(1);
55 }
56 for (i = 0, off = 0; i < testlen; i++) {
57 for (j = 0; j < test[i].cplen; j++, off += ret) {
58 if ((ret = grapheme_encode_utf8(
59 test[i].cp[j], buf + off, *buflen -…
60 (*buflen - off)) {
61 /* shouldn't happen */
62 fprintf(stderr, "generate_utf8_test_buff…
63 "Buffer too small.\n");
64 exit(1);
65 }
66 }
67 }
68 buf[*buflen - 1] = '\0';
69
70 return buf;
71 }
72
73 static double
74 time_diff(clock_t a, clock_t b)
75 {
76 return (double)(b - a) / CLOCKS_PER_SEC;
77 }
78
79 void
80 run_benchmark(void (*func)(const void *), const void *payload, const cha…
81 const char *comment, const char *unit, double *baseline,
82 size_t num_iterations, size_t units_per_iteration)
83 {
84 clock_t start, end;
85 size_t i;
86 double diff;
87
88 printf("\t%s ", name);
89 fflush(stdout);
90
91 start = clock();
92 for (i = 0; i < num_iterations; i++) {
93 func(payload);
94
95 if (i % (num_iterations / 10) == 0) {
96 printf(".");
97 fflush(stdout);
98 }
99 }
100 end = clock();
101 diff = time_diff(start, end) / (double)num_iterations /
102 (double)units_per_iteration;
103
104 if (isnan(*baseline)) {
105 *baseline = diff;
106 printf(" avg. %.3es/%s (baseline)\n", diff, unit);
107 } else {
108 printf(" avg. %.3es/%s (%.2f%% %s%s%s)\n", diff, unit,
109 fabs(1.0 - diff / *baseline) * 100,
110 (diff < *baseline) ? "faster" : "slower",
111 comment ? ", " : "", comment ? comment : "");
112 }
113 }
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.