summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilco Dijkstra <wdijkstr@arm.com>2019-04-09 11:54:34 +0100
committerWilco Dijkstra <wdijkstr@arm.com>2019-04-09 11:54:34 +0100
commit648279f4af423c4783ec1dfa63cb7b46a7640217 (patch)
treefb9277130379baddc55546b600f2c1b0d4b947ad
parent93eebae5168e5cf2abfb4b6266e3fb2ab860cd60 (diff)
downloadglibc-648279f4af423c4783ec1dfa63cb7b46a7640217.tar.gz
Improve string benchtests
Replace slow byte-oriented tests in several string benchmarks with the generic implementations from the string/ directory so the comparisons are more realistic and useful. * benchtests/bench-stpcpy.c (SIMPLE_STPCPY): Remove function. (generic_stpcpy): New function. * benchtests/bench-stpncpy.c (SIMPLE_STPNCPY): Remove function. (generic_stpncpy): New function. * benchtests/bench-strcat.c (SIMPLE_STRCAT): Remove function. (generic_strcat): New function. * benchtests/bench-strcpy.c (SIMPLE_STRCPY): Remove function. (generic_strcpy): New function. * benchtests/bench-strncat.c (SIMPLE_STRNCAT): Remove function. (STUPID_STRNCAT): Remove function. (generic_strncat): New function. * benchtests/bench-strncpy.c (SIMPLE_STRNCPY): Remove function. (STUPID_STRNCPY): Remove function. (generic_strncpy): New function. * benchtests/bench-strnlen.c (SIMPLE_STRNLEN): Remove function. (generic_strnlen): New function. (memchr_strnlen): New function. * benchtests/bench-strlen.c (generic_strlen): Define for WIDE. (memchr_strlen): Likewise.
-rw-r--r--ChangeLog22
-rw-r--r--benchtests/bench-stpcpy.c20
-rw-r--r--benchtests/bench-stpncpy.c47
-rw-r--r--benchtests/bench-strcat.c19
-rw-r--r--benchtests/bench-strcpy.c23
-rw-r--r--benchtests/bench-strlen.c2
-rw-r--r--benchtests/bench-strncat.c28
-rw-r--r--benchtests/bench-strncpy.c43
-rw-r--r--benchtests/bench-strnlen.c31
-rw-r--r--benchtests/bench-wcsnlen.c1
10 files changed, 95 insertions, 141 deletions
diff --git a/ChangeLog b/ChangeLog
index 6c6ea8536c..503eb25ce4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,27 @@
2019-04-09 Wilco Dijkstra <wdijkstr@arm.com>
+ * benchtests/bench-stpcpy.c (SIMPLE_STPCPY): Remove function.
+ (generic_stpcpy): New function.
+ * benchtests/bench-stpncpy.c (SIMPLE_STPNCPY): Remove function.
+ (generic_stpncpy): New function.
+ * benchtests/bench-strcat.c (SIMPLE_STRCAT): Remove function.
+ (generic_strcat): New function.
+ * benchtests/bench-strcpy.c (SIMPLE_STRCPY): Remove function.
+ (generic_strcpy): New function.
+ * benchtests/bench-strncat.c (SIMPLE_STRNCAT): Remove function.
+ (STUPID_STRNCAT): Remove function.
+ (generic_strncat): New function.
+ * benchtests/bench-strncpy.c (SIMPLE_STRNCPY): Remove function.
+ (STUPID_STRNCPY): Remove function.
+ (generic_strncpy): New function.
+ * benchtests/bench-strnlen.c (SIMPLE_STRNLEN): Remove function.
+ (generic_strnlen): New function.
+ (memchr_strnlen): New function.
+ * benchtests/bench-strlen.c (generic_strlen): Define for WIDE.
+ (memchr_strlen): Likewise.
+
+2019-04-09 Wilco Dijkstra <wdijkstr@arm.com>
+
* benchtests/bench-strstr.c (input): Add realistic input text.
(stupid_strstr): Remove function.
(basic_strstr): Add function.
diff --git a/benchtests/bench-stpcpy.c b/benchtests/bench-stpcpy.c
index 74ea54f594..bcea9af1bf 100644
--- a/benchtests/bench-stpcpy.c
+++ b/benchtests/bench-stpcpy.c
@@ -22,24 +22,18 @@
# define TEST_NAME "stpcpy"
#else
# define TEST_NAME "wcpcpy"
+# define generic_stpcpy generic_wcpcpy
#endif /* WIDE */
#include "bench-string.h"
-#ifndef WIDE
-# define SIMPLE_STPCPY simple_stpcpy
-#else
-# define SIMPLE_STPCPY simple_wcpcpy
-#endif /* WIDE */
-
-CHAR *SIMPLE_STPCPY (CHAR *, const CHAR *);
-
-IMPL (SIMPLE_STPCPY, 0)
-IMPL (STPCPY, 1)
CHAR *
-SIMPLE_STPCPY (CHAR *dst, const CHAR *src)
+generic_stpcpy (CHAR *dst, const CHAR *src)
{
- while ((*dst++ = *src++) != '\0');
- return dst - 1;
+ size_t len = STRLEN (src);
+ return (CHAR *) MEMCPY (dst, src, len + 1) + len;
}
+IMPL (STPCPY, 1)
+IMPL (generic_stpcpy, 0)
+
#include "bench-strcpy.c"
diff --git a/benchtests/bench-stpncpy.c b/benchtests/bench-stpncpy.c
index 0470695889..c4c6b65bb7 100644
--- a/benchtests/bench-stpncpy.c
+++ b/benchtests/bench-stpncpy.c
@@ -22,49 +22,22 @@
# define TEST_NAME "stpncpy"
#else
# define TEST_NAME "wcpncpy"
+# define generic_stpncpy generic_wcpncpy
#endif /* WIDE */
#include "bench-string.h"
-#ifndef WIDE
-# define SIMPLE_STPNCPY simple_stpncpy
-# define STUPID_STPNCPY stupid_stpncpy
-#else
-# define SIMPLE_STPNCPY simple_wcpncpy
-# define STUPID_STPNCPY stupid_wcpncpy
-#endif /* WIDE */
-
-CHAR *SIMPLE_STPNCPY (CHAR *, const CHAR *, size_t);
-CHAR *STUPID_STPNCPY (CHAR *, const CHAR *, size_t);
-
-IMPL (STUPID_STPNCPY, 0)
-IMPL (SIMPLE_STPNCPY, 0)
-IMPL (STPNCPY, 1)
-
-CHAR *
-SIMPLE_STPNCPY (CHAR *dst, const CHAR *src, size_t n)
-{
- while (n--)
- if ((*dst++ = *src++) == '\0')
- {
- size_t i;
-
- for (i = 0; i < n; ++i)
- dst[i] = '\0';
- return dst - 1;
- }
- return dst;
-}
CHAR *
-STUPID_STPNCPY (CHAR *dst, const CHAR *src, size_t n)
+generic_stpncpy (CHAR *dst, const CHAR *src, size_t n)
{
size_t nc = STRNLEN (src, n);
- size_t i;
-
- for (i = 0; i < nc; ++i)
- dst[i] = src[i];
- for (; i < n; ++i)
- dst[i] = '\0';
- return dst + nc;
+ MEMCPY (dst, src, nc);
+ dst += nc;
+ if (nc == n)
+ return dst;
+ return MEMSET (dst, 0, n - nc);
}
+IMPL (STPNCPY, 1)
+IMPL (generic_stpncpy, 0)
+
#include "bench-strncpy.c"
diff --git a/benchtests/bench-strcat.c b/benchtests/bench-strcat.c
index a21d94a28e..39d9fefb09 100644
--- a/benchtests/bench-strcat.c
+++ b/benchtests/bench-strcat.c
@@ -21,6 +21,7 @@
# define TEST_NAME "strcat"
#else
# define TEST_NAME "wcscat"
+# define generic_strcat generic_wcscat
#endif /* WIDE */
#include "bench-string.h"
@@ -28,31 +29,25 @@
#ifndef WIDE
# define sfmt "s"
-# define SIMPLE_STRCAT simple_strcat
# define SMALL_CHAR 127
#else
# define sfmt "ls"
-# define SIMPLE_STRCAT simple_wcscat
# define SMALL_CHAR 1273
#endif /* WIDE */
typedef CHAR *(*proto_t) (CHAR *, const CHAR *);
-CHAR *SIMPLE_STRCAT (CHAR *, const CHAR *);
-
-IMPL (SIMPLE_STRCAT, 0)
-IMPL (STRCAT, 1)
CHAR *
-SIMPLE_STRCAT (CHAR *dst, const CHAR *src)
+generic_strcat (CHAR *dst, const CHAR *src)
{
- CHAR *ret = dst;
- while (*dst++ != '\0');
- --dst;
- while ((*dst++ = *src++) != '\0');
- return ret;
+ STRCPY (dst + STRLEN (dst), src);
+ return dst;
}
+IMPL (STRCAT, 1)
+IMPL (generic_strcat, 0)
+
static void
do_one_test (impl_t *impl, CHAR *dst, const CHAR *src)
{
diff --git a/benchtests/bench-strcpy.c b/benchtests/bench-strcpy.c
index 9fe999e5f4..7a7cf4abb2 100644
--- a/benchtests/bench-strcpy.c
+++ b/benchtests/bench-strcpy.c
@@ -33,26 +33,19 @@
# define TEST_NAME "strcpy"
# else
# define TEST_NAME "wcscpy"
+# define generic_strcpy generic_wcscpy
# endif
-# include "bench-string.h"
-# ifndef WIDE
-# define SIMPLE_STRCPY simple_strcpy
-# else
-# define SIMPLE_STRCPY simple_wcscpy
-# endif
-
-CHAR *SIMPLE_STRCPY (CHAR *, const CHAR *);
-
-IMPL (SIMPLE_STRCPY, 0)
-IMPL (STRCPY, 1)
+#include "bench-string.h"
CHAR *
-SIMPLE_STRCPY (CHAR *dst, const CHAR *src)
+generic_strcpy (CHAR *dst, const CHAR *src)
{
- CHAR *ret = dst;
- while ((*dst++ = *src++) != '\0');
- return ret;
+ return MEMCPY (dst, src, STRLEN (src) + 1);
}
+
+IMPL (STRCPY, 1)
+IMPL (generic_strcpy, 0)
+
#endif
typedef CHAR *(*proto_t) (CHAR *, const CHAR *);
diff --git a/benchtests/bench-strlen.c b/benchtests/bench-strlen.c
index f6a8bf5dff..47363af0f7 100644
--- a/benchtests/bench-strlen.c
+++ b/benchtests/bench-strlen.c
@@ -21,6 +21,8 @@
# define TEST_NAME "strlen"
#else
# define TEST_NAME "wcslen"
+# define generic_strlen generic_wcslen
+# define memchr_strlen wcschr_wcslen
#endif
#include "bench-string.h"
diff --git a/benchtests/bench-strncat.c b/benchtests/bench-strncat.c
index 386eafa429..7271626d50 100644
--- a/benchtests/bench-strncat.c
+++ b/benchtests/bench-strncat.c
@@ -21,41 +21,33 @@
# define TEST_NAME "strncat"
#else
# define TEST_NAME "wcsncat"
+# define generic_strncat generic_wcsncat
#endif /* WIDE */
#include "bench-string.h"
#define BIG_CHAR MAX_CHAR
#ifndef WIDE
-# define SIMPLE_STRNCAT simple_strncat
-# define STUPID_STRNCAT stupid_strncat
# define SMALL_CHAR 127
#else
-# define SIMPLE_STRNCAT simple_wcsncat
-# define STUPID_STRNCAT stupid_wcsncat
# define SMALL_CHAR 1273
#endif /* WIDE */
typedef CHAR *(*proto_t) (CHAR *, const CHAR *, size_t);
-CHAR *STUPID_STRNCAT (CHAR *, const CHAR *, size_t);
-CHAR *SIMPLE_STRNCAT (CHAR *, const CHAR *, size_t);
-
-IMPL (STUPID_STRNCAT, 0)
-IMPL (STRNCAT, 2)
CHAR *
-STUPID_STRNCAT (CHAR *dst, const CHAR *src, size_t n)
+generic_strncat (CHAR *dst, const CHAR *src, size_t n)
{
- CHAR *ret = dst;
- while (*dst++ != '\0');
- --dst;
- while (n--)
- if ((*dst++ = *src++) == '\0')
- return ret;
- *dst = '\0';
- return ret;
+ CHAR *end = dst + STRLEN (dst);
+ n = STRNLEN (src, n);
+ end[n] = 0;
+ MEMCPY (end, src, n);
+ return dst;
}
+IMPL (STRNCAT, 2)
+IMPL (generic_strncat, 0)
+
static void
do_one_test (impl_t *impl, CHAR *dst, const CHAR *src, size_t n)
{
diff --git a/benchtests/bench-strncpy.c b/benchtests/bench-strncpy.c
index 35744c1bd6..93bd6d54bf 100644
--- a/benchtests/bench-strncpy.c
+++ b/benchtests/bench-strncpy.c
@@ -31,49 +31,22 @@
# define TEST_NAME "strncpy"
# else
# define TEST_NAME "wcsncpy"
+# define generic_strncpy generic_wcsncpy
# endif /* WIDE */
# include "bench-string.h"
-# ifndef WIDE
-# define SIMPLE_STRNCPY simple_strncpy
-# define STUPID_STRNCPY stupid_strncpy
-# else
-# define SIMPLE_STRNCPY simple_wcsncpy
-# define STUPID_STRNCPY stupid_wcsncpy
-# endif /* WIDE */
-
-CHAR *SIMPLE_STRNCPY (CHAR *, const CHAR *, size_t);
-CHAR *STUPID_STRNCPY (CHAR *, const CHAR *, size_t);
-
-IMPL (STUPID_STRNCPY, 0)
-IMPL (SIMPLE_STRNCPY, 0)
-IMPL (STRNCPY, 1)
CHAR *
-SIMPLE_STRNCPY (CHAR *dst, const CHAR *src, size_t n)
+generic_strncpy (CHAR *dst, const CHAR *src, size_t n)
{
- CHAR *ret = dst;
- while (n--)
- if ((*dst++ = *src++) == '\0')
- {
- while (n--)
- *dst++ = '\0';
- return ret;
- }
- return ret;
+ size_t nc = STRNLEN (src, n);
+ if (nc != n)
+ MEMSET (dst + nc, 0, n - nc);
+ return MEMCPY (dst, src, nc);
}
-CHAR *
-STUPID_STRNCPY (CHAR *dst, const CHAR *src, size_t n)
-{
- size_t nc = STRNLEN (src, n);
- size_t i;
+IMPL (STRNCPY, 1)
+IMPL (generic_strncpy, 0)
- for (i = 0; i < nc; ++i)
- dst[i] = src[i];
- for (; i < n; ++i)
- dst[i] = '\0';
- return dst;
-}
#endif /* !STRNCPY_RESULT */
typedef CHAR *(*proto_t) (CHAR *, const CHAR *, size_t);
diff --git a/benchtests/bench-strnlen.c b/benchtests/bench-strnlen.c
index b9039d5f3f..e9e51b27fc 100644
--- a/benchtests/bench-strnlen.c
+++ b/benchtests/bench-strnlen.c
@@ -21,6 +21,8 @@
# define TEST_NAME "strnlen"
#else
# define TEST_NAME "wcsnlen"
+# define generic_strnlen generic_wcsnlen
+# define memchr_strnlen wcschr_wcsnlen
#endif /* WIDE */
#include "bench-string.h"
@@ -28,27 +30,24 @@
#ifndef WIDE
# define MIDDLE_CHAR 127
-# define SIMPLE_STRNLEN simple_strnlen
#else
# define MIDDLE_CHAR 1121
-# define SIMPLE_STRNLEN simple_wcsnlen
#endif /* WIDE */
typedef size_t (*proto_t) (const CHAR *, size_t);
-size_t SIMPLE_STRNLEN (const CHAR *, size_t);
-
-IMPL (SIMPLE_STRNLEN, 0)
-IMPL (STRNLEN, 1)
+size_t generic_strnlen (const CHAR *, size_t);
size_t
-SIMPLE_STRNLEN (const CHAR *s, size_t maxlen)
+memchr_strnlen (const CHAR *s, size_t maxlen)
{
- size_t i;
-
- for (i = 0; i < maxlen && s[i]; ++i);
- return i;
+ const CHAR *s1 = MEMCHR (s, 0, maxlen);
+ return (s1 == NULL) ? maxlen : s1 - s;
}
+IMPL (STRNLEN, 1)
+IMPL (memchr_strnlen, 0)
+IMPL (generic_strnlen, 0)
+
static void
do_one_test (impl_t *impl, const CHAR *s, size_t maxlen, size_t exp_len)
{
@@ -146,3 +145,13 @@ test_main (void)
}
#include <support/test-driver.c>
+
+#define libc_hidden_def(X)
+#ifndef WIDE
+# undef STRNLEN
+# define STRNLEN generic_strnlen
+# include <string/strnlen.c>
+#else
+# define WCSNLEN generic_strnlen
+# include <wcsmbs/wcsnlen.c>
+#endif
diff --git a/benchtests/bench-wcsnlen.c b/benchtests/bench-wcsnlen.c
index 4bcda71734..3eaea6213e 100644
--- a/benchtests/bench-wcsnlen.c
+++ b/benchtests/bench-wcsnlen.c
@@ -17,4 +17,5 @@
<http://www.gnu.org/licenses/>. */
#define WIDE 1
+#define __wmemchr wmemchr
#include "bench-strnlen.c"