]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
benchtests: Reallocate buffers for memset
authorSiddhesh Poyarekar <siddhesh@sourceware.org>
Thu, 14 Sep 2017 17:09:49 +0000 (22:39 +0530)
committerSiddhesh Poyarekar <siddhesh@sourceware.org>
Thu, 14 Sep 2017 17:24:24 +0000 (22:54 +0530)
Keeping the same buffers along with copying the same size of data into
the same location means that the first routine is typically the
slowest since it has to bear the cost of fetching data into to cache.
Reallocating buffers stabilizes numbers by a bit.

* benchtests/bench-string.h (realloc_bufs): New function.
(test_init): Call it.
* benchtests/bench-memset-large.c (do_test): Likewise.
* benchtests/bench-memset.c (do_test): Likewise.

ChangeLog
benchtests/bench-memset-large.c
benchtests/bench-memset.c
benchtests/bench-string.h

index 88b0d4ee6147b5a0a86bf8804acfb0dd05fe555e..15daa370f38491525bc521f3fcf53d6ef7e21401 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2017-09-14  Siddhesh Poyarekar  <siddhesh@sourceware.org>
 
+       * benchtests/bench-string.h (realloc_bufs): New function.
+       (test_init): Call it.
+       * benchtests/bench-memset-large.c (do_test): Likewise.
+       * benchtests/bench-memset.c (do_test): Likewise.
+
        * benchtests/bench-memset-large.c: Print output in JSON
        format.
        * benchtests/bench-memset.c: Likewise.
index c0f19749f613baed8d01a9ddf127c331fc31e595..6cd48c99eaca24497fb01d9b8ff4632aa3853c61 100644 (file)
@@ -90,7 +90,10 @@ do_test (json_ctx_t *json_ctx, size_t align, int c, size_t len)
   json_array_begin (json_ctx, "timings");
 
   FOR_EACH_IMPL (impl, 0)
-    do_one_test (json_ctx, impl, (CHAR *) (buf1) + align, c, len);
+    {
+      do_one_test (json_ctx, impl, (CHAR *) (buf1) + align, c, len);
+      realloc_bufs ();
+    }
 
   json_array_end (json_ctx);
   json_element_object_end (json_ctx);
index 107e2b7494f221600ddc184d5351271c1604c288..724c1059357a0b3f52da8626dfa108ee417b9245 100644 (file)
@@ -132,7 +132,10 @@ do_test (json_ctx_t *json_ctx, size_t align, int c, size_t len)
   json_array_begin (json_ctx, "timings");
 
   FOR_EACH_IMPL (impl, 0)
-    do_one_test (json_ctx, impl, (CHAR *) (buf1) + align, c, len);
+    {
+      do_one_test (json_ctx, impl, (CHAR *) (buf1) + align, c, len);
+      realloc_bufs ();
+    }
 
   json_array_end (json_ctx);
   json_element_object_end (json_ctx);
index 3aacfdf83e1543f7949b75ffc4ca2f8a3247f1d5..40c735c18ee9893c67539bd2f0b370fed4af7f02 100644 (file)
@@ -173,14 +173,8 @@ static impl_t *impl_array;
 # endif
 
 static void
-test_init (void)
+alloc_bufs (void)
 {
-# ifdef TEST_NAME
-  func_count = __libc_ifunc_impl_list (TEST_NAME, func_list,
-                                      (sizeof func_list
-                                       / sizeof func_list[0]));
-# endif
-
   page_size = 2 * getpagesize ();
 # ifdef MIN_PAGE_SIZE
   if (page_size < MIN_PAGE_SIZE)
@@ -189,15 +183,49 @@ test_init (void)
   buf1 = mmap (0, (BUF1PAGES + 1) * page_size, PROT_READ | PROT_WRITE,
               MAP_PRIVATE | MAP_ANON, -1, 0);
   if (buf1 == MAP_FAILED)
-    error (EXIT_FAILURE, errno, "mmap failed");
+    error (EXIT_FAILURE, errno, "mmap failed for buf1");
   if (mprotect (buf1 + BUF1PAGES * page_size, page_size, PROT_NONE))
-    error (EXIT_FAILURE, errno, "mprotect failed");
+    error (EXIT_FAILURE, errno, "mprotect failed for buf1");
   buf2 = mmap (0, 2 * page_size, PROT_READ | PROT_WRITE,
               MAP_PRIVATE | MAP_ANON, -1, 0);
   if (buf2 == MAP_FAILED)
-    error (EXIT_FAILURE, errno, "mmap failed");
+    error (EXIT_FAILURE, errno, "mmap failed for buf2");
   if (mprotect (buf2 + page_size, page_size, PROT_NONE))
-    error (EXIT_FAILURE, errno, "mprotect failed");
+    error (EXIT_FAILURE, errno, "mprotect failed for buf2");
+}
+
+static void
+__attribute__ ((unused))
+realloc_bufs (void)
+{
+  int ret = 0;
+
+  if (buf1)
+    ret = munmap (buf1, (BUF1PAGES + 1) * page_size);
+
+  if (ret != 0)
+    error (EXIT_FAILURE, errno, "munmap failed for buf1");
+
+  if (buf2)
+    ret = munmap (buf2, 2 * page_size);
+
+  if (ret != 0)
+    error (EXIT_FAILURE, errno, "munmap failed for buf2");
+
+  alloc_bufs ();
+}
+
+static void
+test_init (void)
+{
+# ifdef TEST_NAME
+  func_count = __libc_ifunc_impl_list (TEST_NAME, func_list,
+                                      (sizeof func_list
+                                       / sizeof func_list[0]));
+# endif
+
+  alloc_bufs ();
+
   if (do_srandom)
     {
       printf ("Setting seed to 0x%x\n", seed);