@ -46,10 +46,12 @@ builtin_memcpy (char *dst, const char *src, size_t n)
}
# endif
# include "json-lib.h"
typedef char * ( * proto_t ) ( char * , const char * , size_t ) ;
static void
do_one_test ( impl_t * impl , char * dst , const char * src ,
do_one_test ( json_ctx_t * json_ctx , impl_t * impl , char * dst , const char * src ,
size_t len )
{
size_t i , iters = INNER_LOOP_ITERS ;
@ -84,11 +86,11 @@ do_one_test (impl_t *impl, char *dst, const char *src,
TIMING_DIFF ( cur , start , stop ) ;
TIMING_PRINT_MEAN ( ( double ) cur , ( double ) iters ) ;
json_element_double ( json_ctx , ( double ) cur / ( double ) iters ) ;
}
static void
do_test ( size_t align1 , size_t align2 , size_t len )
do_test ( json_ctx_t * json_ctx , size_t align1 , size_t align2 , size_t len )
{
size_t i , j ;
char * s1 , * s2 ;
@ -107,61 +109,82 @@ do_test (size_t align1, size_t align2, size_t len)
for ( i = 0 , j = 1 ; i < len ; i + + , j + = 23 )
s1 [ i ] = j ;
printf ( " Length %4zd, alignment %2zd/%2zd: " , len , align1 , align2 ) ;
json_element_object_begin ( json_ctx ) ;
json_attr_uint ( json_ctx , " length " , ( double ) len ) ;
json_attr_uint ( json_ctx , " align1 " , ( double ) align1 ) ;
json_attr_uint ( json_ctx , " align2 " , ( double ) align2 ) ;
json_array_begin ( json_ctx , " timings " ) ;
FOR_EACH_IMPL ( impl , 0 )
do_one_test ( impl , s2 , s1 , len ) ;
do_one_test ( json_ctx , impl , s2 , s1 , len ) ;
putchar ( ' \n ' ) ;
json_array_end ( json_ctx ) ;
json_element_object_end ( json_ctx ) ;
}
int
test_main ( void )
{
json_ctx_t json_ctx ;
size_t i ;
test_init ( ) ;
printf ( " %23s " , " " ) ;
json_init ( & json_ctx , 0 , stdout ) ;
json_document_begin ( & json_ctx ) ;
json_attr_string ( & json_ctx , " timing_type " , TIMING_TYPE ) ;
json_attr_object_begin ( & json_ctx , " functions " ) ;
json_attr_object_begin ( & json_ctx , " memcpy " ) ;
json_attr_string ( & json_ctx , " bench-variant " , " default " ) ;
json_array_begin ( & json_ctx , " ifuncs " ) ;
FOR_EACH_IMPL ( impl , 0 )
printf ( " \t %s " , impl - > name ) ;
putchar ( ' \n ' ) ;
json_element_string ( & json_ctx , impl - > name ) ;
json_array_end ( & json_ctx ) ;
json_array_begin ( & json_ctx , " results " ) ;
for ( i = 0 ; i < 18 ; + + i )
{
do_test ( 0 , 0 , 1 < < i ) ;
do_test ( i , 0 , 1 < < i ) ;
do_test ( 0 , i , 1 < < i ) ;
do_test ( i , i , 1 < < i ) ;
do_test ( & json_ctx , 0 , 0 , 1 < < i ) ;
do_test ( & json_ctx , i , 0 , 1 < < i ) ;
do_test ( & json_ctx , 0 , i , 1 < < i ) ;
do_test ( & json_ctx , i , i , 1 < < i ) ;
}
for ( i = 0 ; i < 32 ; + + i )
{
do_test ( 0 , 0 , i ) ;
do_test ( i , 0 , i ) ;
do_test ( 0 , i , i ) ;
do_test ( i , i , i ) ;
do_test ( & json_ctx , 0 , 0 , i ) ;
do_test ( & json_ctx , i , 0 , i ) ;
do_test ( & json_ctx , 0 , i , i ) ;
do_test ( & json_ctx , i , i , i ) ;
}
for ( i = 3 ; i < 32 ; + + i )
{
if ( ( i & ( i - 1 ) ) = = 0 )
continue ;
do_test ( 0 , 0 , 16 * i ) ;
do_test ( i , 0 , 16 * i ) ;
do_test ( 0 , i , 16 * i ) ;
do_test ( i , i , 16 * i ) ;
do_test ( & json_ctx , 0 , 0 , 16 * i ) ;
do_test ( & json_ctx , i , 0 , 16 * i ) ;
do_test ( & json_ctx , 0 , i , 16 * i ) ;
do_test ( & json_ctx , i , i , 16 * i ) ;
}
for ( i = 32 ; i < 64 ; + + i )
{
do_test ( 0 , 0 , 32 * i ) ;
do_test ( i , 0 , 32 * i ) ;
do_test ( 0 , i , 32 * i ) ;
do_test ( i , i , 32 * i ) ;
do_test ( & json_ctx , 0 , 0 , 32 * i ) ;
do_test ( & json_ctx , i , 0 , 32 * i ) ;
do_test ( & json_ctx , 0 , i , 32 * i ) ;
do_test ( & json_ctx , i , i , 32 * i ) ;
}
do_test ( 0 , 0 , getpagesize ( ) ) ;
do_test ( & json_ctx , 0 , 0 , getpagesize ( ) ) ;
json_array_end ( & json_ctx ) ;
json_attr_object_end ( & json_ctx ) ;
json_attr_object_end ( & json_ctx ) ;
json_document_end ( & json_ctx ) ;
return ret ;
}