2019-03-08 21:17:47 +03:00
/*
*
* syscall . c
*
* syscall : Benchmark for system call performance
*/
# include "../perf.h"
# include "../util/util.h"
# include <subcmd/parse-options.h>
# include "../builtin.h"
# include "bench.h"
# include <stdio.h>
# include <sys/time.h>
# include <sys/syscall.h>
# include <sys/types.h>
# include <unistd.h>
# include <stdlib.h>
# define LOOPS_DEFAULT 10000000
static int loops = LOOPS_DEFAULT ;
static const struct option options [ ] = {
OPT_INTEGER ( ' l ' , " loop " , & loops , " Specify number of loops " ) ,
OPT_END ( )
} ;
static const char * const bench_syscall_usage [ ] = {
" perf bench syscall <options> " ,
NULL
} ;
int bench_syscall_basic ( int argc , const char * * argv )
{
struct timeval start , stop , diff ;
unsigned long long result_usec = 0 ;
int i ;
argc = parse_options ( argc , argv , options , bench_syscall_usage , 0 ) ;
gettimeofday ( & start , NULL ) ;
for ( i = 0 ; i < loops ; i + + )
getppid ( ) ;
gettimeofday ( & stop , NULL ) ;
timersub ( & stop , & start , & diff ) ;
switch ( bench_format ) {
case BENCH_FORMAT_DEFAULT :
printf ( " # Executed %'d getppid() calls \n " , loops ) ;
result_usec = diff . tv_sec * 1000000 ;
result_usec + = diff . tv_usec ;
printf ( " %14s: %lu.%03lu [sec] \n \n " , " Total time " ,
2021-02-24 21:24:10 +03:00
( unsigned long ) diff . tv_sec ,
2019-03-08 21:17:47 +03:00
( unsigned long ) ( diff . tv_usec / 1000 ) ) ;
printf ( " %14lf usecs/op \n " ,
( double ) result_usec / ( double ) loops ) ;
printf ( " %'14d ops/sec \n " ,
( int ) ( ( double ) loops /
( ( double ) result_usec / ( double ) 1000000 ) ) ) ;
break ;
case BENCH_FORMAT_SIMPLE :
printf ( " %lu.%03lu \n " ,
2021-02-24 21:24:10 +03:00
( unsigned long ) diff . tv_sec ,
2019-03-08 21:17:47 +03:00
( unsigned long ) ( diff . tv_usec / 1000 ) ) ;
break ;
default :
/* reaching here is something disaster */
fprintf ( stderr , " Unknown format:%d \n " , bench_format ) ;
exit ( 1 ) ;
break ;
}
return 0 ;
}