From: Siddhesh Poyarekar Date: Thu, 14 Sep 2017 17:09:49 +0000 (+0530) Subject: benchtests: Reallocate buffers for memset X-Git-Tag: glibc-2.27~911 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=503c92c37a95f769762e65aff9383b302178c2bc;p=thirdparty%2Fglibc.git benchtests: Reallocate buffers for memset 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. --- diff --git a/ChangeLog b/ChangeLog index 88b0d4ee614..15daa370f38 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 2017-09-14 Siddhesh Poyarekar + * 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. diff --git a/benchtests/bench-memset-large.c b/benchtests/bench-memset-large.c index c0f19749f61..6cd48c99eac 100644 --- a/benchtests/bench-memset-large.c +++ b/benchtests/bench-memset-large.c @@ -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); diff --git a/benchtests/bench-memset.c b/benchtests/bench-memset.c index 107e2b7494f..724c1059357 100644 --- a/benchtests/bench-memset.c +++ b/benchtests/bench-memset.c @@ -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); diff --git a/benchtests/bench-string.h b/benchtests/bench-string.h index 3aacfdf83e1..40c735c18ee 100644 --- a/benchtests/bench-string.h +++ b/benchtests/bench-string.h @@ -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);