Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
benchtests: Switch string benchmarks to use bench-timing.h.
Switch the string benchmarks to using bench-timing.h instead
of hp-timing.h directly. This allows the string benchmarks to
be run usefully on architectures such as ARM that do not have
support for hp-timing.h.

In order to do this the tests have been changed from timing each
individual call and picking the lowest execution time recorded to
timing a number of calls and taking the mean execution time.

ChangeLog:

2013-09-04   Will Newton  <will.newton@linaro.org>

	* benchtests/bench-timing.h (TIMING_PRINT_MEAN): New macro.
	* benchtests/bench-string.h: Include bench-timing.h instead
	of including hp-timing.h directly. (INNER_LOOP_ITERS): New
	define. (HP_TIMING_BEST): Delete macro. (test_init): Remove
	call to HP_TIMING_DIFF_INIT.
	* benchtests/bench-memccpy.c: Use bench-timing.h macros
	instead of hp-timing.h macros.
	* benchtests/bench-memchr.c: Likewise.
	* benchtests/bench-memcmp.c: Likewise.
	* benchtests/bench-memcpy.c: Likewise.
	* benchtests/bench-memmem.c: Likewise.
	* benchtests/bench-memmove.c: Likewise.
	* benchtests/bench-memset.c: Likewise.
	* benchtests/bench-rawmemchr.c: Likewise.
	* benchtests/bench-strcasecmp.c: Likewise.
	* benchtests/bench-strcasestr.c: Likewise.
	* benchtests/bench-strcat.c: Likewise.
	* benchtests/bench-strchr.c: Likewise.
	* benchtests/bench-strcmp.c: Likewise.
	* benchtests/bench-strcpy.c: Likewise.
	* benchtests/bench-strcpy_chk.c: Likewise.
	* benchtests/bench-strlen.c: Likewise.
	* benchtests/bench-strncasecmp.c: Likewise.
	* benchtests/bench-strncat.c: Likewise.
	* benchtests/bench-strncmp.c: Likewise.
	* benchtests/bench-strncpy.c: Likewise.
	* benchtests/bench-strnlen.c: Likewise.
	* benchtests/bench-strpbrk.c: Likewise.
	* benchtests/bench-strrchr.c: Likewise.
	* benchtests/bench-strspn.c: Likewise.
	* benchtests/bench-strstr.c: Likewise.
  • Loading branch information
Will Newton committed Sep 4, 2013
1 parent cae16d6 commit 4455870
Show file tree
Hide file tree
Showing 28 changed files with 368 additions and 502 deletions.
34 changes: 34 additions & 0 deletions ChangeLog
@@ -1,3 +1,37 @@
2013-09-04 Will Newton <will.newton@linaro.org>

* benchtests/bench-timing.h (TIMING_PRINT_MEAN): New macro.
* benchtests/bench-string.h: Include bench-timing.h instead
of including hp-timing.h directly. (INNER_LOOP_ITERS): New
define. (HP_TIMING_BEST): Delete macro. (test_init): Remove
call to HP_TIMING_DIFF_INIT.
* benchtests/bench-memccpy.c: Use bench-timing.h macros
instead of hp-timing.h macros.
* benchtests/bench-memchr.c: Likewise.
* benchtests/bench-memcmp.c: Likewise.
* benchtests/bench-memcpy.c: Likewise.
* benchtests/bench-memmem.c: Likewise.
* benchtests/bench-memmove.c: Likewise.
* benchtests/bench-memset.c: Likewise.
* benchtests/bench-rawmemchr.c: Likewise.
* benchtests/bench-strcasecmp.c: Likewise.
* benchtests/bench-strcasestr.c: Likewise.
* benchtests/bench-strcat.c: Likewise.
* benchtests/bench-strchr.c: Likewise.
* benchtests/bench-strcmp.c: Likewise.
* benchtests/bench-strcpy.c: Likewise.
* benchtests/bench-strcpy_chk.c: Likewise.
* benchtests/bench-strlen.c: Likewise.
* benchtests/bench-strncasecmp.c: Likewise.
* benchtests/bench-strncat.c: Likewise.
* benchtests/bench-strncmp.c: Likewise.
* benchtests/bench-strncpy.c: Likewise.
* benchtests/bench-strnlen.c: Likewise.
* benchtests/bench-strpbrk.c: Likewise.
* benchtests/bench-strrchr.c: Likewise.
* benchtests/bench-strspn.c: Likewise.
* benchtests/bench-strstr.c: Likewise.

2013-09-04 Will Newton <will.newton@linaro.org>

* benchtests/Makefile: Use LDLIBS instead of LDFLAGS.
Expand Down
32 changes: 13 additions & 19 deletions benchtests/bench-memccpy.c
Expand Up @@ -59,6 +59,9 @@ do_one_test (impl_t *impl, void *dst, const void *src, int c, size_t len,
size_t n)
{
void *expect = len > n ? NULL : (char *) dst + len;
size_t i, iters = INNER_LOOP_ITERS;
timing_t start, stop, cur;

if (CALL (impl, dst, src, c, n) != expect)
{
error (0, 0, "Wrong result in function %s %p %p", impl->name,
Expand All @@ -74,23 +77,16 @@ do_one_test (impl_t *impl, void *dst, const void *src, int c, size_t len,
return;
}

if (HP_TIMING_AVAIL)
TIMING_NOW (start);
for (i = 0; i < iters; ++i)
{
hp_timing_t start __attribute__ ((unused));
hp_timing_t stop __attribute__ ((unused));
hp_timing_t best_time = ~ (hp_timing_t) 0;
size_t i;

for (i = 0; i < 32; ++i)
{
HP_TIMING_NOW (start);
CALL (impl, dst, src, c, n);
HP_TIMING_NOW (stop);
HP_TIMING_BEST (best_time, start, stop);
}

printf ("\t%zd", (size_t) best_time);
CALL (impl, dst, src, c, n);
}
TIMING_NOW (stop);

TIMING_DIFF (cur, start, stop);

TIMING_PRINT_MEAN ((double) cur, (double) iters);
}

static void
Expand Down Expand Up @@ -121,14 +117,12 @@ do_test (size_t align1, size_t align2, int c, size_t len, size_t n,
for (i = len; i + align1 < page_size && i < len + 64; ++i)
s1[i] = 32 + 32 * i % (max_char - 32);

if (HP_TIMING_AVAIL)
printf ("Length %4zd, n %4zd, char %d, alignment %2zd/%2zd:", len, n, c, align1, align2);
printf ("Length %4zd, n %4zd, char %d, alignment %2zd/%2zd:", len, n, c, align1, align2);

FOR_EACH_IMPL (impl, 0)
do_one_test (impl, s2, s1, c, len, n);

if (HP_TIMING_AVAIL)
putchar ('\n');
putchar ('\n');
}

int
Expand Down
32 changes: 13 additions & 19 deletions benchtests/bench-memchr.c
Expand Up @@ -39,6 +39,9 @@ static void
do_one_test (impl_t *impl, const char *s, int c, size_t n, char *exp_res)
{
char *res = CALL (impl, s, c, n);
size_t i, iters = INNER_LOOP_ITERS;
timing_t start, stop, cur;

if (res != exp_res)
{
error (0, 0, "Wrong result in function %s %p %p", impl->name,
Expand All @@ -47,23 +50,16 @@ do_one_test (impl_t *impl, const char *s, int c, size_t n, char *exp_res)
return;
}

if (HP_TIMING_AVAIL)
TIMING_NOW (start);
for (i = 0; i < iters; ++i)
{
hp_timing_t start __attribute ((unused));
hp_timing_t stop __attribute ((unused));
hp_timing_t best_time = ~ (hp_timing_t) 0;
size_t i;

for (i = 0; i < 32; ++i)
{
HP_TIMING_NOW (start);
CALL (impl, s, c, n);
HP_TIMING_NOW (stop);
HP_TIMING_BEST (best_time, start, stop);
}

printf ("\t%zd", (size_t) best_time);
CALL (impl, s, c, n);
}
TIMING_NOW (stop);

TIMING_DIFF (cur, start, stop);

TIMING_PRINT_MEAN ((double) cur, (double) iters);
}

static void
Expand Down Expand Up @@ -96,14 +92,12 @@ do_test (size_t align, size_t pos, size_t len, int seek_char)
buf1[align + len] = seek_char;
}

if (HP_TIMING_AVAIL)
printf ("Length %4zd, alignment %2zd:", pos, align);
printf ("Length %4zd, alignment %2zd:", pos, align);

FOR_EACH_IMPL (impl, 0)
do_one_test (impl, (char *) (buf1 + align), seek_char, len, result);

if (HP_TIMING_AVAIL)
putchar ('\n');
putchar ('\n');
}

int
Expand Down
32 changes: 13 additions & 19 deletions benchtests/bench-memcmp.c
Expand Up @@ -78,23 +78,19 @@ static void
do_one_test (impl_t *impl, const CHAR *s1, const CHAR *s2, size_t len,
int exp_result)
{
if (HP_TIMING_AVAIL)
size_t i, iters = INNER_LOOP_ITERS;
timing_t start, stop, cur;

TIMING_NOW (start);
for (i = 0; i < iters; ++i)
{
hp_timing_t start __attribute ((unused));
hp_timing_t stop __attribute ((unused));
hp_timing_t best_time = ~ (hp_timing_t) 0;
size_t i;

for (i = 0; i < 32; ++i)
{
HP_TIMING_NOW (start);
CALL (impl, s1, s2, len);
HP_TIMING_NOW (stop);
HP_TIMING_BEST (best_time, start, stop);
}

printf ("\t%zd", (size_t) best_time);
CALL (impl, s1, s2, len);
}
TIMING_NOW (stop);

TIMING_DIFF (cur, start, stop);

TIMING_PRINT_MEAN ((double) cur, (double) iters);
}

static void
Expand Down Expand Up @@ -124,14 +120,12 @@ do_test (size_t align1, size_t align2, size_t len, int exp_result)
s2[len] = align2;
s2[len - 1] -= exp_result;

if (HP_TIMING_AVAIL)
printf ("Length %4zd, alignment %2zd/%2zd:", len, align1, align2);
printf ("Length %4zd, alignment %2zd/%2zd:", len, align1, align2);

FOR_EACH_IMPL (impl, 0)
do_one_test (impl, s1, s2, len, exp_result);

if (HP_TIMING_AVAIL)
putchar ('\n');
putchar ('\n');
}

int
Expand Down
32 changes: 13 additions & 19 deletions benchtests/bench-memcpy.c
Expand Up @@ -52,6 +52,9 @@ static void
do_one_test (impl_t *impl, char *dst, const char *src,
size_t len)
{
size_t i, iters = INNER_LOOP_ITERS;
timing_t start, stop, cur;

if (CALL (impl, dst, src, len) != MEMCPY_RESULT (dst, len))
{
error (0, 0, "Wrong result in function %s %p %p", impl->name,
Expand All @@ -68,23 +71,16 @@ do_one_test (impl_t *impl, char *dst, const char *src,
return;
}

if (HP_TIMING_AVAIL)
TIMING_NOW (start);
for (i = 0; i < iters; ++i)
{
hp_timing_t start __attribute ((unused));
hp_timing_t stop __attribute ((unused));
hp_timing_t best_time = ~ (hp_timing_t) 0;
size_t i;

for (i = 0; i < 32; ++i)
{
HP_TIMING_NOW (start);
CALL (impl, dst, src, len);
HP_TIMING_NOW (stop);
HP_TIMING_BEST (best_time, start, stop);
}

printf ("\t%zd", (size_t) best_time);
CALL (impl, dst, src, len);
}
TIMING_NOW (stop);

TIMING_DIFF (cur, start, stop);

TIMING_PRINT_MEAN ((double) cur, (double) iters);
}

static void
Expand All @@ -107,14 +103,12 @@ do_test (size_t align1, size_t align2, size_t len)
for (i = 0, j = 1; i < len; i++, j += 23)
s1[i] = j;

if (HP_TIMING_AVAIL)
printf ("Length %4zd, alignment %2zd/%2zd:", len, align1, align2);
printf ("Length %4zd, alignment %2zd/%2zd:", len, align1, align2);

FOR_EACH_IMPL (impl, 0)
do_one_test (impl, s2, s1, len);

if (HP_TIMING_AVAIL)
putchar ('\n');
putchar ('\n');
}

int
Expand Down
36 changes: 14 additions & 22 deletions benchtests/bench-memmem.c
Expand Up @@ -60,23 +60,19 @@ static void
do_one_test (impl_t *impl, const void *haystack, size_t haystack_len,
const void *needle, size_t needle_len, const void *expected)
{
if (HP_TIMING_AVAIL)
size_t i, iters = INNER_LOOP_ITERS;
timing_t start, stop, cur;

TIMING_NOW (start);
for (i = 0; i < iters; ++i)
{
hp_timing_t start __attribute ((unused));
hp_timing_t stop __attribute ((unused));
hp_timing_t best_time = ~ (hp_timing_t) 0;
size_t i;
CALL (impl, haystack, haystack_len, needle, needle_len);
}
TIMING_NOW (stop);

for (i = 0; i < 32; ++i)
{
HP_TIMING_NOW (start);
CALL (impl, haystack, haystack_len, needle, needle_len);
HP_TIMING_NOW (stop);
HP_TIMING_BEST (best_time, start, stop);
}
TIMING_DIFF (cur, start, stop);

printf ("\t%zd", (size_t) best_time);
}
TIMING_PRINT_MEAN ((double) cur, (double) iters);
}

static void
Expand All @@ -87,16 +83,14 @@ do_test (const char *str, size_t len, size_t idx)
memcpy (tmpbuf, buf1 + idx, len);
memcpy (buf1 + idx, str, len);

if (HP_TIMING_AVAIL)
printf ("String %s, offset %zd:", str, idx);
printf ("String %s, offset %zd:", str, idx);

FOR_EACH_IMPL (impl, 0)
do_one_test (impl, buf1, BUF1PAGES * page_size, str, len, buf1 + idx);

memcpy (buf1 + idx, tmpbuf, len);

if (HP_TIMING_AVAIL)
putchar ('\n');
putchar ('\n');
}

static void
Expand All @@ -120,15 +114,13 @@ do_random_tests (void)
buf1[idx + off] = ch;
}

if (HP_TIMING_AVAIL)
printf ("String %.*s, offset %zd:", (int) len, buf1 + idx, idx);
printf ("String %.*s, offset %zd:", (int) len, buf1 + idx, idx);

FOR_EACH_IMPL (impl, 0)
do_one_test (impl, buf1, BUF1PAGES * page_size, buf1 + idx, len,
buf1 + idx);

if (HP_TIMING_AVAIL)
putchar ('\n');
putchar ('\n');

memcpy (buf1 + idx, tmpbuf, len);
}
Expand Down

0 comments on commit 4455870

Please sign in to comment.