Benchtests: Remove simple_strcspn/strpbrk/strsep

Message ID PAWPR08MB8982522B5EE5567FD55710B583B49@PAWPR08MB8982.eurprd08.prod.outlook.com
State Committed
Commit 5de1508803bd1beeadd370ebac19e43b3232380b
Headers
Series Benchtests: Remove simple_strcspn/strpbrk/strsep |

Checks

Context Check Description
dj/TryBot-apply_patch success Patch applied to master at the time it was sent
dj/TryBot-32bit success Build for i686

Commit Message

Wilco Dijkstra March 8, 2023, 11:05 a.m. UTC
  Remove simple_strcspn/strpbrk/strsep which are significantly slower than the generic
implementations. Also remove oldstrsep and oldstrtok since they are practically identical
to the generic implementation.  Adjust iteration count to reduce benchmark time.

---
  

Comments

Adhemerval Zanella March 8, 2023, 3:24 p.m. UTC | #1
On 08/03/23 08:05, Wilco Dijkstra via Libc-alpha wrote:
> 
> Remove simple_strcspn/strpbrk/strsep which are significantly slower than the generic
> implementations. Also remove oldstrsep and oldstrtok since they are practically identical
> to the generic implementation.  Adjust iteration count to reduce benchmark time.

LGTM, thanks.

Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>


> 
> ---
> 
> diff --git a/benchtests/bench-strcspn.c b/benchtests/bench-strcspn.c
> index 2388f33d5441b302ffe34a9bb4ee7ed70db7306b..fa74d305ae66c8f220b2f35d8733520a62a84968 100644
> --- a/benchtests/bench-strcspn.c
> +++ b/benchtests/bench-strcspn.c
> @@ -26,29 +26,8 @@
>  #endif /* WIDE */
>  #include "bench-string.h"
>  
> -#ifndef WIDE
> -# define SIMPLE_STRCSPN simple_strcspn
> -#else
> -# define SIMPLE_STRCSPN simple_wcscspn
> -#endif /* WIDE */
> -
>  typedef size_t (*proto_t) (const CHAR *, const CHAR *);
> -size_t SIMPLE_STRCSPN (const CHAR *, const CHAR *);
>  
> -IMPL (SIMPLE_STRCSPN, 0)
>  IMPL (STRCSPN, 1)
>  
> -size_t
> -SIMPLE_STRCSPN (const CHAR *s, const CHAR *rej)
> -{
> -  const CHAR *r, *str = s;
> -  CHAR c;
> -
> -  while ((c = *s++) != '\0')
> -    for (r = rej; *r != '\0'; ++r)
> -      if (*r == c)
> -	return s - str - 1;
> -  return s - str - 1;
> -}
> -
>  #include "bench-strpbrk.c"
> diff --git a/benchtests/bench-strpbrk.c b/benchtests/bench-strpbrk.c
> index e96fb0efbf06fcb6c329917f73a90149d2bcb944..55199b73c9233bcedf52bd8e45dca628371c2803 100644
> --- a/benchtests/bench-strpbrk.c
> +++ b/benchtests/bench-strpbrk.c
> @@ -35,31 +35,10 @@
>  # endif /* WIDE */
>  # include "bench-string.h"
>  
> -# ifndef WIDE
> -#  define SIMPLE_STRPBRK simple_strpbrk
> -# else
> -#  define SIMPLE_STRPBRK simple_wcspbrk
> -# endif /* WIDE */
> -
>  typedef CHAR *(*proto_t) (const CHAR *, const CHAR *);
> -CHAR *SIMPLE_STRPBRK (const CHAR *, const CHAR *);
>  
> -IMPL (SIMPLE_STRPBRK, 0)
>  IMPL (STRPBRK, 1)
>  
> -CHAR *
> -SIMPLE_STRPBRK (const CHAR *s, const CHAR *rej)
> -{
> -  const CHAR *r;
> -  CHAR c;
> -
> -  while ((c = *s++) != '\0')
> -    for (r = rej; *r != '\0'; ++r)
> -      if (*r == c)
> -	return (CHAR *) s - 1;
> -  return NULL;
> -}
> -
>  #endif /* !STRPBRK_RESULT */
>  
>  #include "json-lib.h"
> @@ -69,7 +48,7 @@ do_one_test (json_ctx_t *json_ctx, impl_t *impl, const CHAR *s,
>               const CHAR *rej, RES_TYPE exp_res)
>  {
>    RES_TYPE res = CALL (impl, s, rej);
> -  size_t i, iters = INNER_LOOP_ITERS;
> +  size_t i, iters = INNER_LOOP_ITERS8 / CHARBYTES;
>    timing_t start, stop, cur;
>  
>    if (res != exp_res)
> diff --git a/benchtests/bench-strsep.c b/benchtests/bench-strsep.c
> index 4b203aff30db1592120db5f0b39b06a6e9cd4a13..d7df3fa0a9aae04918ad54fc7927a1da18ceb402 100644
> --- a/benchtests/bench-strsep.c
> +++ b/benchtests/bench-strsep.c
> @@ -20,90 +20,14 @@
>  #define TEST_NAME "strsep"
>  #include "bench-string.h"
>  
> -char *
> -simple_strsep (char **s1, char *s2)
> -{
> -  char *begin;
> -  char *s;
> -  size_t j = 0;
> -
> -  begin = *s1;
> -  s = begin;
> -  if (begin == NULL)
> -    return NULL;
> -  ssize_t s2len = strlen (s2);
> -  while (*s)
> -    {
> -      for (j = 0; j < s2len; j++)
> -	{
> -	  if (*s == s2[j])
> -	    {
> -	      s[0] = '\0';
> -	      *s1 = s + 1;
> -	      return begin;
> -	    }
> -	}
> -      s++;
> -    }
> -  *s1 = NULL;
> -  return begin;
> -}
> -
> -char *
> -oldstrsep (char **stringp, const char *delim)
> -{
> -  char *begin, *end;
> -
> -  begin = *stringp;
> -  if (begin == NULL)
> -    return NULL;
> -
> -  /* A frequent case is when the delimiter string contains only one
> -     character.  Here we don't need to call the expensive `strpbrk'
> -     function and instead work using `strchr'.  */
> -  if (delim[0] == '\0' || delim[1] == '\0')
> -    {
> -      char ch = delim[0];
> -
> -      if (ch == '\0')
> -	end = NULL;
> -      else
> -	{
> -	  if (*begin == ch)
> -	    end = begin;
> -	  else if (*begin == '\0')
> -	    end = NULL;
> -	  else
> -	    end = strchr (begin + 1, ch);
> -	}
> -    }
> -  else
> -    /* Find the end of the token.  */
> -    end = strpbrk (begin, delim);
> -
> -  if (end)
> -    {
> -      /* Terminate the token and set *STRINGP past NUL character.  */
> -      *end++ = '\0';
> -      *stringp = end;
> -    }
> -  else
> -    /* No more delimiters; this is the last token.  */
> -    *stringp = NULL;
> -
> -  return begin;
> -}
> -
>  typedef char *(*proto_t) (const char **, const char *);
>  
> -IMPL (simple_strsep, 0)
>  IMPL (strsep, 1)
> -IMPL (oldstrsep, 2)
>  
>  static void
>  do_one_test (impl_t * impl, const char *s1, const char *s2)
>  {
> -  size_t i, iters = INNER_LOOP_ITERS_SMALL;
> +  size_t i, iters = INNER_LOOP_ITERS;
>    timing_t start, stop, cur;
>  
>    TIMING_NOW (start);
> diff --git a/benchtests/bench-strspn.c b/benchtests/bench-strspn.c
> index 707613cbcf5ac556e6d5a0c3a95c19be1dcadfc6..cc98ffb38bd5d7085efa8c1d1fb7aba6c46c1b3f 100644
> --- a/benchtests/bench-strspn.c
> +++ b/benchtests/bench-strspn.c
> @@ -28,41 +28,20 @@
>  #define BIG_CHAR MAX_CHAR
>  
>  #ifndef WIDE
> -# define SIMPLE_STRSPN simple_strspn
>  # define SMALL_CHAR 127
>  #else
> -# define SIMPLE_STRSPN simple_wcsspn
>  # define SMALL_CHAR 1273
>  #endif /* WIDE */
>  
>  typedef size_t (*proto_t) (const CHAR *, const CHAR *);
> -size_t SIMPLE_STRSPN (const CHAR *, const CHAR *);
>  
> -IMPL (SIMPLE_STRSPN, 0)
>  IMPL (STRSPN, 1)
>  
> -size_t
> -SIMPLE_STRSPN (const CHAR *s, const CHAR *acc)
> -{
> -  const CHAR *r, *str = s;
> -  CHAR c;
> -
> -  while ((c = *s++) != '\0')
> -    {
> -      for (r = acc; *r != '\0'; ++r)
> -	if (*r == c)
> -	  break;
> -      if (*r == '\0')
> -	return s - str - 1;
> -    }
> -  return s - str - 1;
> -}
> -
>  static void
>  do_one_test (json_ctx_t *json_ctx, impl_t *impl, const CHAR *s,
>               const CHAR *acc, size_t exp_res)
>  {
> -  size_t res = CALL (impl, s, acc), i, iters = INNER_LOOP_ITERS;
> +  size_t res = CALL (impl, s, acc), i, iters = INNER_LOOP_ITERS8 / CHARBYTES;
>    timing_t start, stop, cur;
>  
>    if (res != exp_res)
> diff --git a/benchtests/bench-strtok.c b/benchtests/bench-strtok.c
> index 711bdaab58ff297855b03d62057cefd066f4e1c5..b5789d7bf243c40810f38efd40f0bb9c870327ca 100644
> --- a/benchtests/bench-strtok.c
> +++ b/benchtests/bench-strtok.c
> @@ -20,47 +20,14 @@
>  #define TEST_NAME "strtok"
>  #include "bench-string.h"
>  
> -char *
> -oldstrtok (char *s, const char *delim)
> -{
> -  static char *olds;
> -  char *token;
> -
> -  if (s == NULL)
> -    s = olds;
> -
> -  /* Scan leading delimiters.  */
> -  s += strspn (s, delim);
> -  if (*s == '\0')
> -    {
> -      olds = s;
> -      return NULL;
> -    }
> -
> -  /* Find the end of the token.  */
> -  token = s;
> -  s = strpbrk (token, delim);
> -  if (s == NULL)
> -    /* This token finishes the string.  */
> -    olds = strchr (token, '\0');
> -  else
> -    {
> -      /* Terminate the token and make OLDS point past it.  */
> -      *s = '\0';
> -      olds = s + 1;
> -    }
> -  return token;
> -}
> -
>  typedef char *(*proto_t) (const char *, const char *);
>  
> -IMPL (oldstrtok, 0)
>  IMPL (strtok, 1)
>  
>  static void
>  do_one_test (impl_t * impl, const char *s1, const char *s2)
>  {
> -  size_t i, iters = INNER_LOOP_ITERS_SMALL;
> +  size_t i, iters = INNER_LOOP_ITERS_MEDIUM;
>    timing_t start, stop, cur;
>    TIMING_NOW (start);
>    for (i = 0; i < iters; ++i)
> @@ -74,7 +41,6 @@ do_one_test (impl_t * impl, const char *s1, const char *s2)
>    TIMING_DIFF (cur, start, stop);
>  
>    TIMING_PRINT_MEAN ((double) cur, (double) iters);
> -
>  }
>  
>  
>
  

Patch

diff --git a/benchtests/bench-strcspn.c b/benchtests/bench-strcspn.c
index 2388f33d5441b302ffe34a9bb4ee7ed70db7306b..fa74d305ae66c8f220b2f35d8733520a62a84968 100644
--- a/benchtests/bench-strcspn.c
+++ b/benchtests/bench-strcspn.c
@@ -26,29 +26,8 @@ 
 #endif /* WIDE */
 #include "bench-string.h"
 
-#ifndef WIDE
-# define SIMPLE_STRCSPN simple_strcspn
-#else
-# define SIMPLE_STRCSPN simple_wcscspn
-#endif /* WIDE */
-
 typedef size_t (*proto_t) (const CHAR *, const CHAR *);
-size_t SIMPLE_STRCSPN (const CHAR *, const CHAR *);
 
-IMPL (SIMPLE_STRCSPN, 0)
 IMPL (STRCSPN, 1)
 
-size_t
-SIMPLE_STRCSPN (const CHAR *s, const CHAR *rej)
-{
-  const CHAR *r, *str = s;
-  CHAR c;
-
-  while ((c = *s++) != '\0')
-    for (r = rej; *r != '\0'; ++r)
-      if (*r == c)
-	return s - str - 1;
-  return s - str - 1;
-}
-
 #include "bench-strpbrk.c"
diff --git a/benchtests/bench-strpbrk.c b/benchtests/bench-strpbrk.c
index e96fb0efbf06fcb6c329917f73a90149d2bcb944..55199b73c9233bcedf52bd8e45dca628371c2803 100644
--- a/benchtests/bench-strpbrk.c
+++ b/benchtests/bench-strpbrk.c
@@ -35,31 +35,10 @@ 
 # endif /* WIDE */
 # include "bench-string.h"
 
-# ifndef WIDE
-#  define SIMPLE_STRPBRK simple_strpbrk
-# else
-#  define SIMPLE_STRPBRK simple_wcspbrk
-# endif /* WIDE */
-
 typedef CHAR *(*proto_t) (const CHAR *, const CHAR *);
-CHAR *SIMPLE_STRPBRK (const CHAR *, const CHAR *);
 
-IMPL (SIMPLE_STRPBRK, 0)
 IMPL (STRPBRK, 1)
 
-CHAR *
-SIMPLE_STRPBRK (const CHAR *s, const CHAR *rej)
-{
-  const CHAR *r;
-  CHAR c;
-
-  while ((c = *s++) != '\0')
-    for (r = rej; *r != '\0'; ++r)
-      if (*r == c)
-	return (CHAR *) s - 1;
-  return NULL;
-}
-
 #endif /* !STRPBRK_RESULT */
 
 #include "json-lib.h"
@@ -69,7 +48,7 @@  do_one_test (json_ctx_t *json_ctx, impl_t *impl, const CHAR *s,
              const CHAR *rej, RES_TYPE exp_res)
 {
   RES_TYPE res = CALL (impl, s, rej);
-  size_t i, iters = INNER_LOOP_ITERS;
+  size_t i, iters = INNER_LOOP_ITERS8 / CHARBYTES;
   timing_t start, stop, cur;
 
   if (res != exp_res)
diff --git a/benchtests/bench-strsep.c b/benchtests/bench-strsep.c
index 4b203aff30db1592120db5f0b39b06a6e9cd4a13..d7df3fa0a9aae04918ad54fc7927a1da18ceb402 100644
--- a/benchtests/bench-strsep.c
+++ b/benchtests/bench-strsep.c
@@ -20,90 +20,14 @@ 
 #define TEST_NAME "strsep"
 #include "bench-string.h"
 
-char *
-simple_strsep (char **s1, char *s2)
-{
-  char *begin;
-  char *s;
-  size_t j = 0;
-
-  begin = *s1;
-  s = begin;
-  if (begin == NULL)
-    return NULL;
-  ssize_t s2len = strlen (s2);
-  while (*s)
-    {
-      for (j = 0; j < s2len; j++)
-	{
-	  if (*s == s2[j])
-	    {
-	      s[0] = '\0';
-	      *s1 = s + 1;
-	      return begin;
-	    }
-	}
-      s++;
-    }
-  *s1 = NULL;
-  return begin;
-}
-
-char *
-oldstrsep (char **stringp, const char *delim)
-{
-  char *begin, *end;
-
-  begin = *stringp;
-  if (begin == NULL)
-    return NULL;
-
-  /* A frequent case is when the delimiter string contains only one
-     character.  Here we don't need to call the expensive `strpbrk'
-     function and instead work using `strchr'.  */
-  if (delim[0] == '\0' || delim[1] == '\0')
-    {
-      char ch = delim[0];
-
-      if (ch == '\0')
-	end = NULL;
-      else
-	{
-	  if (*begin == ch)
-	    end = begin;
-	  else if (*begin == '\0')
-	    end = NULL;
-	  else
-	    end = strchr (begin + 1, ch);
-	}
-    }
-  else
-    /* Find the end of the token.  */
-    end = strpbrk (begin, delim);
-
-  if (end)
-    {
-      /* Terminate the token and set *STRINGP past NUL character.  */
-      *end++ = '\0';
-      *stringp = end;
-    }
-  else
-    /* No more delimiters; this is the last token.  */
-    *stringp = NULL;
-
-  return begin;
-}
-
 typedef char *(*proto_t) (const char **, const char *);
 
-IMPL (simple_strsep, 0)
 IMPL (strsep, 1)
-IMPL (oldstrsep, 2)
 
 static void
 do_one_test (impl_t * impl, const char *s1, const char *s2)
 {
-  size_t i, iters = INNER_LOOP_ITERS_SMALL;
+  size_t i, iters = INNER_LOOP_ITERS;
   timing_t start, stop, cur;
 
   TIMING_NOW (start);
diff --git a/benchtests/bench-strspn.c b/benchtests/bench-strspn.c
index 707613cbcf5ac556e6d5a0c3a95c19be1dcadfc6..cc98ffb38bd5d7085efa8c1d1fb7aba6c46c1b3f 100644
--- a/benchtests/bench-strspn.c
+++ b/benchtests/bench-strspn.c
@@ -28,41 +28,20 @@ 
 #define BIG_CHAR MAX_CHAR
 
 #ifndef WIDE
-# define SIMPLE_STRSPN simple_strspn
 # define SMALL_CHAR 127
 #else
-# define SIMPLE_STRSPN simple_wcsspn
 # define SMALL_CHAR 1273
 #endif /* WIDE */
 
 typedef size_t (*proto_t) (const CHAR *, const CHAR *);
-size_t SIMPLE_STRSPN (const CHAR *, const CHAR *);
 
-IMPL (SIMPLE_STRSPN, 0)
 IMPL (STRSPN, 1)
 
-size_t
-SIMPLE_STRSPN (const CHAR *s, const CHAR *acc)
-{
-  const CHAR *r, *str = s;
-  CHAR c;
-
-  while ((c = *s++) != '\0')
-    {
-      for (r = acc; *r != '\0'; ++r)
-	if (*r == c)
-	  break;
-      if (*r == '\0')
-	return s - str - 1;
-    }
-  return s - str - 1;
-}
-
 static void
 do_one_test (json_ctx_t *json_ctx, impl_t *impl, const CHAR *s,
              const CHAR *acc, size_t exp_res)
 {
-  size_t res = CALL (impl, s, acc), i, iters = INNER_LOOP_ITERS;
+  size_t res = CALL (impl, s, acc), i, iters = INNER_LOOP_ITERS8 / CHARBYTES;
   timing_t start, stop, cur;
 
   if (res != exp_res)
diff --git a/benchtests/bench-strtok.c b/benchtests/bench-strtok.c
index 711bdaab58ff297855b03d62057cefd066f4e1c5..b5789d7bf243c40810f38efd40f0bb9c870327ca 100644
--- a/benchtests/bench-strtok.c
+++ b/benchtests/bench-strtok.c
@@ -20,47 +20,14 @@ 
 #define TEST_NAME "strtok"
 #include "bench-string.h"
 
-char *
-oldstrtok (char *s, const char *delim)
-{
-  static char *olds;
-  char *token;
-
-  if (s == NULL)
-    s = olds;
-
-  /* Scan leading delimiters.  */
-  s += strspn (s, delim);
-  if (*s == '\0')
-    {
-      olds = s;
-      return NULL;
-    }
-
-  /* Find the end of the token.  */
-  token = s;
-  s = strpbrk (token, delim);
-  if (s == NULL)
-    /* This token finishes the string.  */
-    olds = strchr (token, '\0');
-  else
-    {
-      /* Terminate the token and make OLDS point past it.  */
-      *s = '\0';
-      olds = s + 1;
-    }
-  return token;
-}
-
 typedef char *(*proto_t) (const char *, const char *);
 
-IMPL (oldstrtok, 0)
 IMPL (strtok, 1)
 
 static void
 do_one_test (impl_t * impl, const char *s1, const char *s2)
 {
-  size_t i, iters = INNER_LOOP_ITERS_SMALL;
+  size_t i, iters = INNER_LOOP_ITERS_MEDIUM;
   timing_t start, stop, cur;
   TIMING_NOW (start);
   for (i = 0; i < iters; ++i)
@@ -74,7 +41,6 @@  do_one_test (impl_t * impl, const char *s1, const char *s2)
   TIMING_DIFF (cur, start, stop);
 
   TIMING_PRINT_MEAN ((double) cur, (double) iters);
-
 }