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.
This commit is contained in:
Siddhesh Poyarekar 2017-09-14 22:39:49 +05:30
parent 29c933fb35
commit 503c92c37a
4 changed files with 52 additions and 13 deletions

View file

@ -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.

View 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);

View 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);

View 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);