[v4,3/8] Benchtests: Improve memrchr benchmarks

Message ID 20220606223726.2082226-3-goldstein.w.n@gmail.com
State Committed
Commit d0370d992e5e7b4a8843e8e130f6c86b483ab7d0
Headers
Series [v4,1/8] x86: Create header for VEC classes in x86 strings library |

Checks

Context Check Description
dj/TryBot-apply_patch success Patch applied to master at the time it was sent

Commit Message

Noah Goldstein June 6, 2022, 10:37 p.m. UTC
  Add a second iteration for memrchr to set `pos` starting from the end
of the buffer.

Previously `pos` was only set relative to the begining of the
buffer. This isn't really useful for memchr because the begining
of the search space is (buf + len).
---
 benchtests/bench-memchr.c | 110 ++++++++++++++++++++++----------------
 1 file changed, 65 insertions(+), 45 deletions(-)
  

Comments

H.J. Lu June 7, 2022, 2:44 a.m. UTC | #1
On Mon, Jun 6, 2022 at 3:37 PM Noah Goldstein <goldstein.w.n@gmail.com> wrote:
>
> Add a second iteration for memrchr to set `pos` starting from the end
> of the buffer.
>
> Previously `pos` was only set relative to the begining of the

   beginning
> buffer. This isn't really useful for memchr because the beginning
                                                       memrchr
> of the search space is (buf + len).
> ---
>  benchtests/bench-memchr.c | 110 ++++++++++++++++++++++----------------
>  1 file changed, 65 insertions(+), 45 deletions(-)
>
> diff --git a/benchtests/bench-memchr.c b/benchtests/bench-memchr.c
> index 4d7212332f..0facda2fa0 100644
> --- a/benchtests/bench-memchr.c
> +++ b/benchtests/bench-memchr.c
> @@ -76,7 +76,7 @@ do_one_test (json_ctx_t *json_ctx, impl_t *impl, const CHAR *s, int c,
>
>  static void
>  do_test (json_ctx_t *json_ctx, size_t align, size_t pos, size_t len,
> -        int seek_char)
> +        int seek_char, int invert_pos)
>  {
>    size_t i;
>
> @@ -96,7 +96,10 @@ do_test (json_ctx_t *json_ctx, size_t align, size_t pos, size_t len,
>
>    if (pos < len)
>      {
> -      buf[align + pos] = seek_char;
> +      if (invert_pos)
> +       buf[align + len - pos] = seek_char;
> +      else
> +       buf[align + pos] = seek_char;
>        buf[align + len] = -seek_char;
>      }
>    else
> @@ -109,6 +112,7 @@ do_test (json_ctx_t *json_ctx, size_t align, size_t pos, size_t len,
>    json_attr_uint (json_ctx, "pos", pos);
>    json_attr_uint (json_ctx, "len", len);
>    json_attr_uint (json_ctx, "seek_char", seek_char);
> +  json_attr_uint (json_ctx, "invert_pos", invert_pos);
>
>    json_array_begin (json_ctx, "timings");
>
> @@ -123,6 +127,7 @@ int
>  test_main (void)
>  {
>    size_t i;
> +  int repeats;
>    json_ctx_t json_ctx;
>    test_init ();
>
> @@ -142,53 +147,68 @@ test_main (void)
>
>    json_array_begin (&json_ctx, "results");
>
> -  for (i = 1; i < 8; ++i)
> +  for (repeats = 0; repeats < 2; ++repeats)
>      {
> -      do_test (&json_ctx, 0, 16 << i, 2048, 23);
> -      do_test (&json_ctx, i, 64, 256, 23);
> -      do_test (&json_ctx, 0, 16 << i, 2048, 0);
> -      do_test (&json_ctx, i, 64, 256, 0);
> -
> -      do_test (&json_ctx, getpagesize () - 15, 64, 256, 0);
> +      for (i = 1; i < 8; ++i)
> +       {
> +         do_test (&json_ctx, 0, 16 << i, 2048, 23, repeats);
> +         do_test (&json_ctx, i, 64, 256, 23, repeats);
> +         do_test (&json_ctx, 0, 16 << i, 2048, 0, repeats);
> +         do_test (&json_ctx, i, 64, 256, 0, repeats);
> +
> +         do_test (&json_ctx, getpagesize () - 15, 64, 256, 0, repeats);
>  #ifdef USE_AS_MEMRCHR
> -      /* Also test the position close to the beginning for memrchr.  */
> -      do_test (&json_ctx, 0, i, 256, 23);
> -      do_test (&json_ctx, 0, i, 256, 0);
> -      do_test (&json_ctx, i, i, 256, 23);
> -      do_test (&json_ctx, i, i, 256, 0);
> +         /* Also test the position close to the beginning for memrchr.  */
> +         do_test (&json_ctx, 0, i, 256, 23, repeats);
> +         do_test (&json_ctx, 0, i, 256, 0, repeats);
> +         do_test (&json_ctx, i, i, 256, 23, repeats);
> +         do_test (&json_ctx, i, i, 256, 0, repeats);
>  #endif
> -    }
> -  for (i = 1; i < 8; ++i)
> -    {
> -      do_test (&json_ctx, i, i << 5, 192, 23);
> -      do_test (&json_ctx, i, i << 5, 192, 0);
> -      do_test (&json_ctx, i, i << 5, 256, 23);
> -      do_test (&json_ctx, i, i << 5, 256, 0);
> -      do_test (&json_ctx, i, i << 5, 512, 23);
> -      do_test (&json_ctx, i, i << 5, 512, 0);
> -
> -      do_test (&json_ctx, getpagesize () - 15, i << 5, 256, 23);
> -    }
> -  for (i = 1; i < 32; ++i)
> -    {
> -      do_test (&json_ctx, 0, i, i + 1, 23);
> -      do_test (&json_ctx, 0, i, i + 1, 0);
> -      do_test (&json_ctx, i, i, i + 1, 23);
> -      do_test (&json_ctx, i, i, i + 1, 0);
> -      do_test (&json_ctx, 0, i, i - 1, 23);
> -      do_test (&json_ctx, 0, i, i - 1, 0);
> -      do_test (&json_ctx, i, i, i - 1, 23);
> -      do_test (&json_ctx, i, i, i - 1, 0);
> -
> -      do_test (&json_ctx, getpagesize () - 15, i, i - 1, 23);
> -      do_test (&json_ctx, getpagesize () - 15, i, i - 1, 0);
> -
> -      do_test (&json_ctx, getpagesize () - 15, i, i + 1, 23);
> -      do_test (&json_ctx, getpagesize () - 15, i, i + 1, 0);
> +       }
> +      for (i = 1; i < 8; ++i)
> +       {
> +         do_test (&json_ctx, i, i << 5, 192, 23, repeats);
> +         do_test (&json_ctx, i, i << 5, 192, 0, repeats);
> +         do_test (&json_ctx, i, i << 5, 256, 23, repeats);
> +         do_test (&json_ctx, i, i << 5, 256, 0, repeats);
> +         do_test (&json_ctx, i, i << 5, 512, 23, repeats);
> +         do_test (&json_ctx, i, i << 5, 512, 0, repeats);
> +
> +         do_test (&json_ctx, getpagesize () - 15, i << 5, 256, 23, repeats);
> +       }
> +      for (i = 1; i < 32; ++i)
> +       {
> +         do_test (&json_ctx, 0, i, i + 1, 23, repeats);
> +         do_test (&json_ctx, 0, i, i + 1, 0, repeats);
> +         do_test (&json_ctx, i, i, i + 1, 23, repeats);
> +         do_test (&json_ctx, i, i, i + 1, 0, repeats);
> +         do_test (&json_ctx, 0, i, i - 1, 23, repeats);
> +         do_test (&json_ctx, 0, i, i - 1, 0, repeats);
> +         do_test (&json_ctx, i, i, i - 1, 23, repeats);
> +         do_test (&json_ctx, i, i, i - 1, 0, repeats);
> +
> +         do_test (&json_ctx, getpagesize () / 2, i, i + 1, 23, repeats);
> +         do_test (&json_ctx, getpagesize () / 2, i, i + 1, 0, repeats);
> +         do_test (&json_ctx, getpagesize () / 2 + i, i, i + 1, 23, repeats);
> +         do_test (&json_ctx, getpagesize () / 2 + i, i, i + 1, 0, repeats);
> +         do_test (&json_ctx, getpagesize () / 2, i, i - 1, 23, repeats);
> +         do_test (&json_ctx, getpagesize () / 2, i, i - 1, 0, repeats);
> +         do_test (&json_ctx, getpagesize () / 2 + i, i, i - 1, 23, repeats);
> +         do_test (&json_ctx, getpagesize () / 2 + i, i, i - 1, 0, repeats);
> +
> +         do_test (&json_ctx, getpagesize () - 15, i, i - 1, 23, repeats);
> +         do_test (&json_ctx, getpagesize () - 15, i, i - 1, 0, repeats);
> +
> +         do_test (&json_ctx, getpagesize () - 15, i, i + 1, 23, repeats);
> +         do_test (&json_ctx, getpagesize () - 15, i, i + 1, 0, repeats);
> +
>  #ifdef USE_AS_MEMRCHR
> -      /* Also test the position close to the beginning for memrchr.  */
> -      do_test (&json_ctx, 0, 1, i + 1, 23);
> -      do_test (&json_ctx, 0, 2, i + 1, 0);
> +         do_test (&json_ctx, 0, 1, i + 1, 23, repeats);
> +         do_test (&json_ctx, 0, 2, i + 1, 0, repeats);
> +#endif
> +       }
> +#ifndef USE_AS_MEMRCHR
> +      break;
>  #endif
>      }
>
> --
> 2.34.1
>
  
Noah Goldstein June 7, 2022, 4:10 a.m. UTC | #2
On Mon, Jun 6, 2022 at 7:44 PM H.J. Lu <hjl.tools@gmail.com> wrote:
>
> On Mon, Jun 6, 2022 at 3:37 PM Noah Goldstein <goldstein.w.n@gmail.com> wrote:
> >
> > Add a second iteration for memrchr to set `pos` starting from the end
> > of the buffer.
> >
> > Previously `pos` was only set relative to the begining of the
>
>    beginning
> > buffer. This isn't really useful for memchr because the beginning
>                                                        memrchr

Fixed in V5.
> > of the search space is (buf + len).
> > ---
> >  benchtests/bench-memchr.c | 110 ++++++++++++++++++++++----------------
> >  1 file changed, 65 insertions(+), 45 deletions(-)
> >
> > diff --git a/benchtests/bench-memchr.c b/benchtests/bench-memchr.c
> > index 4d7212332f..0facda2fa0 100644
> > --- a/benchtests/bench-memchr.c
> > +++ b/benchtests/bench-memchr.c
> > @@ -76,7 +76,7 @@ do_one_test (json_ctx_t *json_ctx, impl_t *impl, const CHAR *s, int c,
> >
> >  static void
> >  do_test (json_ctx_t *json_ctx, size_t align, size_t pos, size_t len,
> > -        int seek_char)
> > +        int seek_char, int invert_pos)
> >  {
> >    size_t i;
> >
> > @@ -96,7 +96,10 @@ do_test (json_ctx_t *json_ctx, size_t align, size_t pos, size_t len,
> >
> >    if (pos < len)
> >      {
> > -      buf[align + pos] = seek_char;
> > +      if (invert_pos)
> > +       buf[align + len - pos] = seek_char;
> > +      else
> > +       buf[align + pos] = seek_char;
> >        buf[align + len] = -seek_char;
> >      }
> >    else
> > @@ -109,6 +112,7 @@ do_test (json_ctx_t *json_ctx, size_t align, size_t pos, size_t len,
> >    json_attr_uint (json_ctx, "pos", pos);
> >    json_attr_uint (json_ctx, "len", len);
> >    json_attr_uint (json_ctx, "seek_char", seek_char);
> > +  json_attr_uint (json_ctx, "invert_pos", invert_pos);
> >
> >    json_array_begin (json_ctx, "timings");
> >
> > @@ -123,6 +127,7 @@ int
> >  test_main (void)
> >  {
> >    size_t i;
> > +  int repeats;
> >    json_ctx_t json_ctx;
> >    test_init ();
> >
> > @@ -142,53 +147,68 @@ test_main (void)
> >
> >    json_array_begin (&json_ctx, "results");
> >
> > -  for (i = 1; i < 8; ++i)
> > +  for (repeats = 0; repeats < 2; ++repeats)
> >      {
> > -      do_test (&json_ctx, 0, 16 << i, 2048, 23);
> > -      do_test (&json_ctx, i, 64, 256, 23);
> > -      do_test (&json_ctx, 0, 16 << i, 2048, 0);
> > -      do_test (&json_ctx, i, 64, 256, 0);
> > -
> > -      do_test (&json_ctx, getpagesize () - 15, 64, 256, 0);
> > +      for (i = 1; i < 8; ++i)
> > +       {
> > +         do_test (&json_ctx, 0, 16 << i, 2048, 23, repeats);
> > +         do_test (&json_ctx, i, 64, 256, 23, repeats);
> > +         do_test (&json_ctx, 0, 16 << i, 2048, 0, repeats);
> > +         do_test (&json_ctx, i, 64, 256, 0, repeats);
> > +
> > +         do_test (&json_ctx, getpagesize () - 15, 64, 256, 0, repeats);
> >  #ifdef USE_AS_MEMRCHR
> > -      /* Also test the position close to the beginning for memrchr.  */
> > -      do_test (&json_ctx, 0, i, 256, 23);
> > -      do_test (&json_ctx, 0, i, 256, 0);
> > -      do_test (&json_ctx, i, i, 256, 23);
> > -      do_test (&json_ctx, i, i, 256, 0);
> > +         /* Also test the position close to the beginning for memrchr.  */
> > +         do_test (&json_ctx, 0, i, 256, 23, repeats);
> > +         do_test (&json_ctx, 0, i, 256, 0, repeats);
> > +         do_test (&json_ctx, i, i, 256, 23, repeats);
> > +         do_test (&json_ctx, i, i, 256, 0, repeats);
> >  #endif
> > -    }
> > -  for (i = 1; i < 8; ++i)
> > -    {
> > -      do_test (&json_ctx, i, i << 5, 192, 23);
> > -      do_test (&json_ctx, i, i << 5, 192, 0);
> > -      do_test (&json_ctx, i, i << 5, 256, 23);
> > -      do_test (&json_ctx, i, i << 5, 256, 0);
> > -      do_test (&json_ctx, i, i << 5, 512, 23);
> > -      do_test (&json_ctx, i, i << 5, 512, 0);
> > -
> > -      do_test (&json_ctx, getpagesize () - 15, i << 5, 256, 23);
> > -    }
> > -  for (i = 1; i < 32; ++i)
> > -    {
> > -      do_test (&json_ctx, 0, i, i + 1, 23);
> > -      do_test (&json_ctx, 0, i, i + 1, 0);
> > -      do_test (&json_ctx, i, i, i + 1, 23);
> > -      do_test (&json_ctx, i, i, i + 1, 0);
> > -      do_test (&json_ctx, 0, i, i - 1, 23);
> > -      do_test (&json_ctx, 0, i, i - 1, 0);
> > -      do_test (&json_ctx, i, i, i - 1, 23);
> > -      do_test (&json_ctx, i, i, i - 1, 0);
> > -
> > -      do_test (&json_ctx, getpagesize () - 15, i, i - 1, 23);
> > -      do_test (&json_ctx, getpagesize () - 15, i, i - 1, 0);
> > -
> > -      do_test (&json_ctx, getpagesize () - 15, i, i + 1, 23);
> > -      do_test (&json_ctx, getpagesize () - 15, i, i + 1, 0);
> > +       }
> > +      for (i = 1; i < 8; ++i)
> > +       {
> > +         do_test (&json_ctx, i, i << 5, 192, 23, repeats);
> > +         do_test (&json_ctx, i, i << 5, 192, 0, repeats);
> > +         do_test (&json_ctx, i, i << 5, 256, 23, repeats);
> > +         do_test (&json_ctx, i, i << 5, 256, 0, repeats);
> > +         do_test (&json_ctx, i, i << 5, 512, 23, repeats);
> > +         do_test (&json_ctx, i, i << 5, 512, 0, repeats);
> > +
> > +         do_test (&json_ctx, getpagesize () - 15, i << 5, 256, 23, repeats);
> > +       }
> > +      for (i = 1; i < 32; ++i)
> > +       {
> > +         do_test (&json_ctx, 0, i, i + 1, 23, repeats);
> > +         do_test (&json_ctx, 0, i, i + 1, 0, repeats);
> > +         do_test (&json_ctx, i, i, i + 1, 23, repeats);
> > +         do_test (&json_ctx, i, i, i + 1, 0, repeats);
> > +         do_test (&json_ctx, 0, i, i - 1, 23, repeats);
> > +         do_test (&json_ctx, 0, i, i - 1, 0, repeats);
> > +         do_test (&json_ctx, i, i, i - 1, 23, repeats);
> > +         do_test (&json_ctx, i, i, i - 1, 0, repeats);
> > +
> > +         do_test (&json_ctx, getpagesize () / 2, i, i + 1, 23, repeats);
> > +         do_test (&json_ctx, getpagesize () / 2, i, i + 1, 0, repeats);
> > +         do_test (&json_ctx, getpagesize () / 2 + i, i, i + 1, 23, repeats);
> > +         do_test (&json_ctx, getpagesize () / 2 + i, i, i + 1, 0, repeats);
> > +         do_test (&json_ctx, getpagesize () / 2, i, i - 1, 23, repeats);
> > +         do_test (&json_ctx, getpagesize () / 2, i, i - 1, 0, repeats);
> > +         do_test (&json_ctx, getpagesize () / 2 + i, i, i - 1, 23, repeats);
> > +         do_test (&json_ctx, getpagesize () / 2 + i, i, i - 1, 0, repeats);
> > +
> > +         do_test (&json_ctx, getpagesize () - 15, i, i - 1, 23, repeats);
> > +         do_test (&json_ctx, getpagesize () - 15, i, i - 1, 0, repeats);
> > +
> > +         do_test (&json_ctx, getpagesize () - 15, i, i + 1, 23, repeats);
> > +         do_test (&json_ctx, getpagesize () - 15, i, i + 1, 0, repeats);
> > +
> >  #ifdef USE_AS_MEMRCHR
> > -      /* Also test the position close to the beginning for memrchr.  */
> > -      do_test (&json_ctx, 0, 1, i + 1, 23);
> > -      do_test (&json_ctx, 0, 2, i + 1, 0);
> > +         do_test (&json_ctx, 0, 1, i + 1, 23, repeats);
> > +         do_test (&json_ctx, 0, 2, i + 1, 0, repeats);
> > +#endif
> > +       }
> > +#ifndef USE_AS_MEMRCHR
> > +      break;
> >  #endif
> >      }
> >
> > --
> > 2.34.1
> >
>
>
> --
> H.J.
  

Patch

diff --git a/benchtests/bench-memchr.c b/benchtests/bench-memchr.c
index 4d7212332f..0facda2fa0 100644
--- a/benchtests/bench-memchr.c
+++ b/benchtests/bench-memchr.c
@@ -76,7 +76,7 @@  do_one_test (json_ctx_t *json_ctx, impl_t *impl, const CHAR *s, int c,
 
 static void
 do_test (json_ctx_t *json_ctx, size_t align, size_t pos, size_t len,
-	 int seek_char)
+	 int seek_char, int invert_pos)
 {
   size_t i;
 
@@ -96,7 +96,10 @@  do_test (json_ctx_t *json_ctx, size_t align, size_t pos, size_t len,
 
   if (pos < len)
     {
-      buf[align + pos] = seek_char;
+      if (invert_pos)
+	buf[align + len - pos] = seek_char;
+      else
+	buf[align + pos] = seek_char;
       buf[align + len] = -seek_char;
     }
   else
@@ -109,6 +112,7 @@  do_test (json_ctx_t *json_ctx, size_t align, size_t pos, size_t len,
   json_attr_uint (json_ctx, "pos", pos);
   json_attr_uint (json_ctx, "len", len);
   json_attr_uint (json_ctx, "seek_char", seek_char);
+  json_attr_uint (json_ctx, "invert_pos", invert_pos);
 
   json_array_begin (json_ctx, "timings");
 
@@ -123,6 +127,7 @@  int
 test_main (void)
 {
   size_t i;
+  int repeats;
   json_ctx_t json_ctx;
   test_init ();
 
@@ -142,53 +147,68 @@  test_main (void)
 
   json_array_begin (&json_ctx, "results");
 
-  for (i = 1; i < 8; ++i)
+  for (repeats = 0; repeats < 2; ++repeats)
     {
-      do_test (&json_ctx, 0, 16 << i, 2048, 23);
-      do_test (&json_ctx, i, 64, 256, 23);
-      do_test (&json_ctx, 0, 16 << i, 2048, 0);
-      do_test (&json_ctx, i, 64, 256, 0);
-
-      do_test (&json_ctx, getpagesize () - 15, 64, 256, 0);
+      for (i = 1; i < 8; ++i)
+	{
+	  do_test (&json_ctx, 0, 16 << i, 2048, 23, repeats);
+	  do_test (&json_ctx, i, 64, 256, 23, repeats);
+	  do_test (&json_ctx, 0, 16 << i, 2048, 0, repeats);
+	  do_test (&json_ctx, i, 64, 256, 0, repeats);
+
+	  do_test (&json_ctx, getpagesize () - 15, 64, 256, 0, repeats);
 #ifdef USE_AS_MEMRCHR
-      /* Also test the position close to the beginning for memrchr.  */
-      do_test (&json_ctx, 0, i, 256, 23);
-      do_test (&json_ctx, 0, i, 256, 0);
-      do_test (&json_ctx, i, i, 256, 23);
-      do_test (&json_ctx, i, i, 256, 0);
+	  /* Also test the position close to the beginning for memrchr.  */
+	  do_test (&json_ctx, 0, i, 256, 23, repeats);
+	  do_test (&json_ctx, 0, i, 256, 0, repeats);
+	  do_test (&json_ctx, i, i, 256, 23, repeats);
+	  do_test (&json_ctx, i, i, 256, 0, repeats);
 #endif
-    }
-  for (i = 1; i < 8; ++i)
-    {
-      do_test (&json_ctx, i, i << 5, 192, 23);
-      do_test (&json_ctx, i, i << 5, 192, 0);
-      do_test (&json_ctx, i, i << 5, 256, 23);
-      do_test (&json_ctx, i, i << 5, 256, 0);
-      do_test (&json_ctx, i, i << 5, 512, 23);
-      do_test (&json_ctx, i, i << 5, 512, 0);
-
-      do_test (&json_ctx, getpagesize () - 15, i << 5, 256, 23);
-    }
-  for (i = 1; i < 32; ++i)
-    {
-      do_test (&json_ctx, 0, i, i + 1, 23);
-      do_test (&json_ctx, 0, i, i + 1, 0);
-      do_test (&json_ctx, i, i, i + 1, 23);
-      do_test (&json_ctx, i, i, i + 1, 0);
-      do_test (&json_ctx, 0, i, i - 1, 23);
-      do_test (&json_ctx, 0, i, i - 1, 0);
-      do_test (&json_ctx, i, i, i - 1, 23);
-      do_test (&json_ctx, i, i, i - 1, 0);
-
-      do_test (&json_ctx, getpagesize () - 15, i, i - 1, 23);
-      do_test (&json_ctx, getpagesize () - 15, i, i - 1, 0);
-
-      do_test (&json_ctx, getpagesize () - 15, i, i + 1, 23);
-      do_test (&json_ctx, getpagesize () - 15, i, i + 1, 0);
+	}
+      for (i = 1; i < 8; ++i)
+	{
+	  do_test (&json_ctx, i, i << 5, 192, 23, repeats);
+	  do_test (&json_ctx, i, i << 5, 192, 0, repeats);
+	  do_test (&json_ctx, i, i << 5, 256, 23, repeats);
+	  do_test (&json_ctx, i, i << 5, 256, 0, repeats);
+	  do_test (&json_ctx, i, i << 5, 512, 23, repeats);
+	  do_test (&json_ctx, i, i << 5, 512, 0, repeats);
+
+	  do_test (&json_ctx, getpagesize () - 15, i << 5, 256, 23, repeats);
+	}
+      for (i = 1; i < 32; ++i)
+	{
+	  do_test (&json_ctx, 0, i, i + 1, 23, repeats);
+	  do_test (&json_ctx, 0, i, i + 1, 0, repeats);
+	  do_test (&json_ctx, i, i, i + 1, 23, repeats);
+	  do_test (&json_ctx, i, i, i + 1, 0, repeats);
+	  do_test (&json_ctx, 0, i, i - 1, 23, repeats);
+	  do_test (&json_ctx, 0, i, i - 1, 0, repeats);
+	  do_test (&json_ctx, i, i, i - 1, 23, repeats);
+	  do_test (&json_ctx, i, i, i - 1, 0, repeats);
+
+	  do_test (&json_ctx, getpagesize () / 2, i, i + 1, 23, repeats);
+	  do_test (&json_ctx, getpagesize () / 2, i, i + 1, 0, repeats);
+	  do_test (&json_ctx, getpagesize () / 2 + i, i, i + 1, 23, repeats);
+	  do_test (&json_ctx, getpagesize () / 2 + i, i, i + 1, 0, repeats);
+	  do_test (&json_ctx, getpagesize () / 2, i, i - 1, 23, repeats);
+	  do_test (&json_ctx, getpagesize () / 2, i, i - 1, 0, repeats);
+	  do_test (&json_ctx, getpagesize () / 2 + i, i, i - 1, 23, repeats);
+	  do_test (&json_ctx, getpagesize () / 2 + i, i, i - 1, 0, repeats);
+
+	  do_test (&json_ctx, getpagesize () - 15, i, i - 1, 23, repeats);
+	  do_test (&json_ctx, getpagesize () - 15, i, i - 1, 0, repeats);
+
+	  do_test (&json_ctx, getpagesize () - 15, i, i + 1, 23, repeats);
+	  do_test (&json_ctx, getpagesize () - 15, i, i + 1, 0, repeats);
+
 #ifdef USE_AS_MEMRCHR
-      /* Also test the position close to the beginning for memrchr.  */
-      do_test (&json_ctx, 0, 1, i + 1, 23);
-      do_test (&json_ctx, 0, 2, i + 1, 0);
+	  do_test (&json_ctx, 0, 1, i + 1, 23, repeats);
+	  do_test (&json_ctx, 0, 2, i + 1, 0, repeats);
+#endif
+	}
+#ifndef USE_AS_MEMRCHR
+      break;
 #endif
     }