Bench: Improve benchtests for memchr, strchr, strnlen, strrchr
authorNoah Goldstein <goldstein.w.n@gmail.com>
Wed, 19 Oct 2022 00:44:09 +0000 (17:44 -0700)
committerNoah Goldstein <goldstein.w.n@gmail.com>
Thu, 20 Oct 2022 00:31:03 +0000 (17:31 -0700)
1. Add more complete coverage in the medium size range.
2. In strnlen remove the `1 << i` which was UB (`i` could go beyond
   32/64)

benchtests/bench-memchr.c
benchtests/bench-rawmemchr.c
benchtests/bench-strchr.c
benchtests/bench-strnlen.c
benchtests/bench-strrchr.c

index 0facda2fa006fd7413af3d3cc0b94cd4a6e135b7..2ec9dd86d089bbe1aeacb9d448a23ab3a23ff56c 100644 (file)
@@ -126,7 +126,7 @@ do_test (json_ctx_t *json_ctx, size_t align, size_t pos, size_t len,
 int
 test_main (void)
 {
-  size_t i;
+  size_t i, j, al, al_max;
   int repeats;
   json_ctx_t json_ctx;
   test_init ();
@@ -147,35 +147,46 @@ test_main (void)
 
   json_array_begin (&json_ctx, "results");
 
+  al_max = 0;
+#ifdef USE_AS_MEMRCHR
+  al_max = getpagesize () / 2;
+#endif
+
   for (repeats = 0; repeats < 2; ++repeats)
     {
-      for (i = 1; i < 8; ++i)
+      for (al = 0; al <= al_max; al += getpagesize () / 2)
        {
-         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);
+         for (i = 1; i < 8; ++i)
+           {
+             do_test (&json_ctx, al, 16 << i, 2048, 23, repeats);
+             do_test (&json_ctx, al + i, 64, 256, 23, repeats);
+             do_test (&json_ctx, al, 16 << i, 2048, 0, repeats);
+             do_test (&json_ctx, al + i, 64, 256, 0, repeats);
+
+             do_test (&json_ctx, al + 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, 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);
+             /* Also test the position close to the beginning for memrchr.  */
+             do_test (&json_ctx, al, i, 256, 23, repeats);
+             do_test (&json_ctx, al, i, 256, 0, repeats);
+             do_test (&json_ctx, al + i, i, 256, 23, repeats);
+             do_test (&json_ctx, al + i, i, 256, 0, repeats);
 #endif
+           }
+         for (i = 1; i < 8; ++i)
+           {
+             do_test (&json_ctx, al + i, i << 5, 192, 23, repeats);
+             do_test (&json_ctx, al + i, i << 5, 192, 0, repeats);
+             do_test (&json_ctx, al + i, i << 5, 256, 23, repeats);
+             do_test (&json_ctx, al + i, i << 5, 256, 0, repeats);
+             do_test (&json_ctx, al + i, i << 5, 512, 23, repeats);
+             do_test (&json_ctx, al + i, i << 5, 512, 0, repeats);
+
+             do_test (&json_ctx, al + getpagesize () - 15, i << 5, 256, 23,
+                      repeats);
+           }
        }
-      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);
@@ -207,6 +218,24 @@ test_main (void)
          do_test (&json_ctx, 0, 2, i + 1, 0, repeats);
 #endif
        }
+      for (al = 0; al <= al_max; al += getpagesize () / 2)
+       {
+         for (i = (16 / sizeof (CHAR)); i <= (8192 / sizeof (CHAR)); i += i)
+           {
+             for (j = 0; j <= (384 / sizeof (CHAR));
+                  j += (32 / sizeof (CHAR)))
+               {
+                 do_test (&json_ctx, al, i + j, i, 23, repeats);
+                 do_test (&json_ctx, al, i, i + j, 23, repeats);
+                 if (j < i)
+                   {
+                     do_test (&json_ctx, al, i - j, i, 23, repeats);
+                     do_test (&json_ctx, al, i, i - j, 23, repeats);
+                   }
+               }
+           }
+       }
+
 #ifndef USE_AS_MEMRCHR
       break;
 #endif
index b1803afc14657297b77d8dde7c1ef6f755484a2a..dab77f385810b534be2a83a908454007fe7ba263 100644 (file)
@@ -70,7 +70,7 @@ do_test (json_ctx_t *json_ctx, size_t align, size_t pos, size_t len, int seek_ch
   size_t i;
   char *result;
 
-  align &= 7;
+  align &= getpagesize () - 1;
   if (align + len >= page_size)
     return;
 
@@ -106,7 +106,6 @@ test_main (void)
 {
   json_ctx_t json_ctx;
   size_t i;
-
   test_init ();
 
   json_init (&json_ctx, 0, stdout);
@@ -120,7 +119,7 @@ test_main (void)
 
   json_array_begin (&json_ctx, "ifuncs");
   FOR_EACH_IMPL (impl, 0)
-      json_element_string (&json_ctx, impl->name);
+    json_element_string (&json_ctx, impl->name);
   json_array_end (&json_ctx);
 
   json_array_begin (&json_ctx, "results");
@@ -137,6 +136,31 @@ test_main (void)
       do_test (&json_ctx, 0, i, i + 1, 23);
       do_test (&json_ctx, 0, i, i + 1, 0);
     }
+  for (; i < 256; i += 32)
+    {
+      do_test (&json_ctx, 0, i, i + 1, 23);
+      do_test (&json_ctx, 0, i - 1, i, 23);
+    }
+  for (; i < 512; i += 64)
+    {
+      do_test (&json_ctx, 0, i, i + 1, 23);
+      do_test (&json_ctx, 0, i - 1, i, 23);
+    }
+  for (; i < 1024; i += 128)
+    {
+      do_test (&json_ctx, 0, i, i + 1, 23);
+      do_test (&json_ctx, 0, i - 1, i, 23);
+    }
+  for (; i < 2048; i += 256)
+    {
+      do_test (&json_ctx, 0, i, i + 1, 23);
+      do_test (&json_ctx, 0, i - 1, i, 23);
+    }
+  for (; i < 4096; i += 512)
+    {
+      do_test (&json_ctx, 0, i, i + 1, 23);
+      do_test (&json_ctx, 0, i - 1, i, 23);
+    }
 
   json_array_end (&json_ctx);
   json_attr_object_end (&json_ctx);
index 54640bde7ec98a617cc169ba0ba2f3dae19579da..aeb882d4425ec3145ab50344c87313f60ffe19be 100644 (file)
@@ -287,8 +287,8 @@ int
 test_main (void)
 {
   json_ctx_t json_ctx;
-  size_t i;
 
+  size_t i, j;
   test_init ();
 
   json_init (&json_ctx, 0, stdout);
@@ -367,15 +367,30 @@ test_main (void)
       do_test (&json_ctx, 0, i, i + 1, 0, BIG_CHAR);
     }
 
-  DO_RAND_TEST(&json_ctx, 0, 15, 16, 0.0);
-  DO_RAND_TEST(&json_ctx, 0, 15, 16, 0.1);
-  DO_RAND_TEST(&json_ctx, 0, 15, 16, 0.25);
-  DO_RAND_TEST(&json_ctx, 0, 15, 16, 0.33);
-  DO_RAND_TEST(&json_ctx, 0, 15, 16, 0.5);
-  DO_RAND_TEST(&json_ctx, 0, 15, 16, 0.66);
-  DO_RAND_TEST(&json_ctx, 0, 15, 16, 0.75);
-  DO_RAND_TEST(&json_ctx, 0, 15, 16, 0.9);
-  DO_RAND_TEST(&json_ctx, 0, 15, 16, 1.0);
+  for (i = 16 / sizeof (CHAR); i <= 8192 / sizeof (CHAR); i += i)
+    {
+      for (j = 32 / sizeof (CHAR); j <= 320 / sizeof (CHAR);
+          j += 32 / sizeof (CHAR))
+       {
+         do_test (&json_ctx, 0, i, i + j, 0, MIDDLE_CHAR);
+         do_test (&json_ctx, 0, i + j, i, 0, MIDDLE_CHAR);
+         if (i > j)
+           {
+             do_test (&json_ctx, 0, i, i - j, 0, MIDDLE_CHAR);
+             do_test (&json_ctx, 0, i - j, i, 0, MIDDLE_CHAR);
+           }
+       }
+    }
+
+  DO_RAND_TEST (&json_ctx, 0, 15, 16, 0.0);
+  DO_RAND_TEST (&json_ctx, 0, 15, 16, 0.1);
+  DO_RAND_TEST (&json_ctx, 0, 15, 16, 0.25);
+  DO_RAND_TEST (&json_ctx, 0, 15, 16, 0.33);
+  DO_RAND_TEST (&json_ctx, 0, 15, 16, 0.5);
+  DO_RAND_TEST (&json_ctx, 0, 15, 16, 0.66);
+  DO_RAND_TEST (&json_ctx, 0, 15, 16, 0.75);
+  DO_RAND_TEST (&json_ctx, 0, 15, 16, 0.9);
+  DO_RAND_TEST (&json_ctx, 0, 15, 16, 1.0);
 
   json_array_end (&json_ctx);
   json_attr_object_end (&json_ctx);
index 13b46b3f5723df4e96ba11c08387577d14bb3ee1..82c02eb6eda182771112ff3821f075168c48c1e5 100644 (file)
@@ -195,19 +195,19 @@ test_main (void)
     {
       for (j = 0; j <= (704 / sizeof (CHAR)); j += (32 / sizeof (CHAR)))
        {
-         do_test (&json_ctx, 0, 1 << i, (i + j), BIG_CHAR);
          do_test (&json_ctx, 0, i + j, i, BIG_CHAR);
-
-         do_test (&json_ctx, 64, 1 << i, (i + j), BIG_CHAR);
          do_test (&json_ctx, 64, i + j, i, BIG_CHAR);
 
+         do_test (&json_ctx, 0, i, i + j, BIG_CHAR);
+         do_test (&json_ctx, 64, i, i + j, BIG_CHAR);
+
          if (j < i)
            {
-             do_test (&json_ctx, 0, 1 << i, i - j, BIG_CHAR);
              do_test (&json_ctx, 0, i - j, i, BIG_CHAR);
-
-             do_test (&json_ctx, 64, 1 << i, i - j, BIG_CHAR);
              do_test (&json_ctx, 64, i - j, i, BIG_CHAR);
+
+             do_test (&json_ctx, 0, i, i - j, BIG_CHAR);
+             do_test (&json_ctx, 64, i, i - j, BIG_CHAR);
            }
        }
     }
index 7cd2a154841f95880beb189b5fc5c14fd71f953b..3fcf3f281d27650a07c90e4e6955c39366ec2246 100644 (file)
@@ -151,7 +151,7 @@ int
 test_main (void)
 {
   json_ctx_t json_ctx;
-  size_t i, j;
+  size_t i, j, k;
   int seek;
 
   test_init ();
@@ -173,7 +173,7 @@ test_main (void)
 
   for (seek = 0; seek <= 23; seek += 23)
     {
-      for (j = 1; j < 32; j += j)
+      for (j = 1; j <= 256; j = (j * 4))
        {
          for (i = 1; i < 9; ++i)
            {
@@ -197,6 +197,30 @@ test_main (void)
              do_test (&json_ctx, getpagesize () - i / 2 - 1, i, i + 1, seek,
                       SMALL_CHAR, j);
            }
+
+         for (i = (16 / sizeof (CHAR)); i <= (288 / sizeof (CHAR)); i += 32)
+           {
+             do_test (&json_ctx, 0, i - 16, i, seek, SMALL_CHAR, j);
+             do_test (&json_ctx, 0, i, i + 16, seek, SMALL_CHAR, j);
+           }
+
+         for (i = (16 / sizeof (CHAR)); i <= (2048 / sizeof (CHAR)); i += i)
+           {
+             for (k = 0; k <= (288 / sizeof (CHAR));
+                  k += (48 / sizeof (CHAR)))
+               {
+                 do_test (&json_ctx, 0, k, i, seek, SMALL_CHAR, j);
+                 do_test (&json_ctx, 0, i, i + k, seek, SMALL_CHAR, j);
+
+                 if (k < i)
+                   {
+                     do_test (&json_ctx, 0, i - k, i, seek, SMALL_CHAR, j);
+                     do_test (&json_ctx, 0, k, i - k, seek, SMALL_CHAR, j);
+                     do_test (&json_ctx, 0, i, i - k, seek, SMALL_CHAR, j);
+                   }
+               }
+           }
+
          if (seek == 0)
            {
              break;