unistd: Improve fortify with clang
[glibc.git] / benchtests / bench-wcrtomb.c
blob232a7d59de4356efe314741e9a2d35b212007bc3
1 /* Measure wcrtomb function.
2 Copyright The GNU Toolchain Authors.
3 This file is part of the GNU C Library.
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, see
17 <https://www.gnu.org/licenses/>. */
19 #include <array_length.h>
20 #include <limits.h>
21 #include <locale.h>
22 #include <string.h>
23 #include <wchar.h>
25 #include "bench-timing.h"
26 #include "json-lib.h"
28 #define NITERS 100000
30 struct test_inputs
32 const char *locale;
33 const wchar_t *input_chars;
36 /* The inputs represent different types of characters, e.g. RTL, 1 byte, 2
37 byte, 3 byte and 4 byte chars. The exact number of inputs per locale
38 doesn't really matter because we're not looking to compare performance
39 between locales. */
40 struct test_inputs inputs[] =
42 /* RTL. */
43 {"ar_SA.UTF-8",
44 L",-.،؟ـًُّ٠٢٣٤ءآأؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهوىي"},
46 /* Various mixes of 1 and 2 byte chars. */
47 {"cs_CZ.UTF-8",
48 L",.aAábcCčdDďeEéÉěĚfFghHiIíJlLmMnNňŇoóÓpPqQrřsSšŠTťuUúÚůŮvVWxyýz"},
50 {"el_GR.UTF-8",
51 L",.αΑβγδΔεΕζηΗθΘιΙκΚλμΜνΝξοΟπΠρΡσΣςτυΥφΦχψω"},
53 {"en_GB.UTF-8",
54 L",.aAāĀæÆǽǣǢbcCċdDðÐeEēĒfFgGġhHiIīĪlLmMnNoōpPqQrsSTuUūŪvVwxyȝzþÞƿǷ"},
56 {"fr_FR.UTF-8",
57 L",.aAàâbcCçdDeEéèêëfFghHiIîïjlLmMnNoOôœpPqQrRsSTuUùûvVwxyz"},
59 {"he_IL.UTF-8",
60 L"',.ִאבגדהוזחטיכךלמםנןסעפףצץקרשת"},
62 /* Devanagari, Japanese, 3-byte chars. */
63 {"hi_IN.UTF-8",
64 L"(।ं०४५७अआइईउऎएओऔकखगघचछजञटडढणतथदधनपफ़बभमयरलवशषसहािीुूृेैोौ्"},
66 {"ja_JP.UTF-8",
67 L".ー0123456789あアいイうウえエおオかカがきキぎくクぐけケげこコごさサざ"},
69 /* More mixtures of 1 and 2 byte chars. */
70 {"ru_RU.UTF-8",
71 L",.аАбвВгдДеЕёЁжЖзЗийЙкКлЛмМнНоОпПрстТуУфФхХЦчшШщъыЫьэЭюЮя"},
73 {"sr_RS.UTF-8",
74 L",.aAbcCćčdDđĐeEfgGhHiIlLmMnNoOpPqQrsSšŠTuUvVxyzZž"},
76 {"sv_SE.UTF-8",
77 L",.aAåÅäÄæÆbBcCdDeEfFghHiIjlLmMnNoOöÖpPqQrsSTuUvVwxyz"},
79 /* Chinese, 3-byte chars */
80 {"zh_CN.UTF-8",
81 L"一七三下不与世両並中串主乱予事二五亡京人今仕付以任企伎会伸住佐体作使"},
83 /* 4-byte chars, because smileys are the universal language and we want to
84 ensure optimal performance with them 😊. */
85 {"en_US.UTF-8",
86 L"😀😁😂😃😄😅😆😇😈😉😊😋😌😍😎😏😐😑😒😓😔😕😖😗😘😙😚😛😜😝😞😟😠😡"}
89 char buf[MB_LEN_MAX];
90 size_t ret;
92 int
93 main (int argc, char **argv)
95 json_ctx_t json_ctx;
96 json_init (&json_ctx, 0, stdout);
97 json_document_begin (&json_ctx);
99 json_attr_string (&json_ctx, "timing_type", TIMING_TYPE);
100 json_attr_object_begin (&json_ctx, "functions");
101 json_attr_object_begin (&json_ctx, "wcrtomb");
103 for (size_t i = 0; i < array_length (inputs); i++)
105 json_attr_object_begin (&json_ctx, inputs[i].locale);
106 setlocale (LC_ALL, inputs[i].locale);
108 timing_t min = 0x7fffffffffffffff, max = 0, total = 0;
109 const wchar_t *inp = inputs[i].input_chars;
110 const size_t len = wcslen (inp);
111 mbstate_t s;
113 memset (&s, '\0', sizeof (s));
115 for (size_t n = 0; n < NITERS; n++)
117 timing_t start, end, elapsed;
119 TIMING_NOW (start);
120 for (size_t j = 0; j < len; j++)
121 ret = wcrtomb (buf, inp[j], &s);
122 TIMING_NOW (end);
123 TIMING_DIFF (elapsed, start, end);
124 if (min > elapsed)
125 min = elapsed;
126 if (max < elapsed)
127 max = elapsed;
128 TIMING_ACCUM (total, elapsed);
130 json_attr_double (&json_ctx, "max", max);
131 json_attr_double (&json_ctx, "min", min);
132 json_attr_double (&json_ctx, "mean", total / NITERS);
133 json_attr_object_end (&json_ctx);
136 json_attr_object_end (&json_ctx);
137 json_attr_object_end (&json_ctx);
138 json_document_end (&json_ctx);