1
0
mirror of https://https.git.savannah.gnu.org/git/gnulib.git synced 2026-05-13 07:03:33 +00:00
Files
gnulib/tests/bench-strnul.c
Bruno Haible 45bac631c5 strnul-bench-tests: New module.
* tests/bench-strnul.c: New file.
* modules/strnul-bench-tests: New file.
2026-02-22 08:58:11 +01:00

141 lines
3.2 KiB
C

/* Benchmark for strnul().
Copyright (C) 2026 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. */
#include <config.h>
#include <string.h>
#include "bench.h"
#include "bench-multibyte.h"
const char * volatile input;
const char * volatile output;
static _GL_ATTRIBUTE_NOINLINE void
do_strnul_test (char test, int repeat, const char *text)
{
printf ("Test %c\n", test);
struct timings_state ts;
timing_start (&ts);
for (int count = 0; count < repeat; count++)
{
input = text;
output = strnul (input);
}
timing_end (&ts);
timing_output (&ts);
printf ("\n");
}
static _GL_ATTRIBUTE_NOINLINE void
do_strlen_test (char test, int repeat, const char *text)
{
printf ("Test %c\n", test);
size_t (* volatile p_strlen) (const char *) = strlen;
struct timings_state ts;
timing_start (&ts);
for (int count = 0; count < repeat; count++)
{
input = text;
output = input + p_strlen (input);
}
timing_end (&ts);
timing_output (&ts);
printf ("\n");
}
static _GL_ATTRIBUTE_NOINLINE void
do_strchr_test (char test, int repeat, const char *text)
{
printf ("Test %c\n", test);
char * (* volatile p_strchr) (const char *, int) = strchr;
struct timings_state ts;
timing_start (&ts);
for (int count = 0; count < repeat; count++)
{
input = text;
output = p_strchr (input, '\0');
}
timing_end (&ts);
timing_output (&ts);
printf ("\n");
}
/* Performs some or all of the following tests:
n - strnul
l - strlen
c - strchr
Pass the tests to be performed as first argument. */
int
main (int argc, char *argv[])
{
if (argc != 4)
{
fprintf (stderr, "Usage: %s TESTS LENGTH REPETITIONS\n", argv[0]);
fprintf (stderr, "Example: %s nlc 100 1000000\n", argv[0]);
exit (1);
}
const char *tests = argv[1];
int length = atoi (argv[2]);
int repeat = atoi (argv[3]);
text_init ();
if (length > strlen (text_french_iso8859))
{
fprintf (stderr, "LENGTH too large, should be <= %zu\n",
strlen (text_french_iso8859));
exit (1);
}
const char *text =
text_french_iso8859 + strlen (text_french_iso8859) - length;
/* Execute each test. */
for (size_t i = 0; i < strlen (tests); i++)
{
char test = tests[i];
switch (test)
{
case 'n':
do_strnul_test (test, repeat, text);
break;
case 'l':
do_strlen_test (test, repeat, text);
break;
case 'c':
do_strchr_test (test, repeat, text);
break;
default:
/* Ignore. */
;
}
}
return 0;
}