1 /* 2 * 3 * syscall.c 4 * 5 * syscall: Benchmark for system call performance 6 */ 7 #include "../perf.h" 8 #include "../util/util.h" 9 #include <subcmd/parse-options.h> 10 #include "../builtin.h" 11 #include "bench.h" 12 13 #include <stdio.h> 14 #include <sys/time.h> 15 #include <sys/syscall.h> 16 #include <sys/types.h> 17 #include <unistd.h> 18 #include <stdlib.h> 19 20 #define LOOPS_DEFAULT 10000000 21 static int loops = LOOPS_DEFAULT; 22 23 static const struct option options[] = { 24 OPT_INTEGER('l', "loop", &loops, "Specify number of loops"), 25 OPT_END() 26 }; 27 28 static const char * const bench_syscall_usage[] = { 29 "perf bench syscall <options>", 30 NULL 31 }; 32 33 int bench_syscall_basic(int argc, const char **argv) 34 { 35 struct timeval start, stop, diff; 36 unsigned long long result_usec = 0; 37 int i; 38 39 argc = parse_options(argc, argv, options, bench_syscall_usage, 0); 40 41 gettimeofday(&start, NULL); 42 43 for (i = 0; i < loops; i++) 44 getppid(); 45 46 gettimeofday(&stop, NULL); 47 timersub(&stop, &start, &diff); 48 49 switch (bench_format) { 50 case BENCH_FORMAT_DEFAULT: 51 printf("# Executed %'d getppid() calls\n", loops); 52 53 result_usec = diff.tv_sec * 1000000; 54 result_usec += diff.tv_usec; 55 56 printf(" %14s: %lu.%03lu [sec]\n\n", "Total time", 57 diff.tv_sec, 58 (unsigned long) (diff.tv_usec/1000)); 59 60 printf(" %14lf usecs/op\n", 61 (double)result_usec / (double)loops); 62 printf(" %'14d ops/sec\n", 63 (int)((double)loops / 64 ((double)result_usec / (double)1000000))); 65 break; 66 67 case BENCH_FORMAT_SIMPLE: 68 printf("%lu.%03lu\n", 69 diff.tv_sec, 70 (unsigned long) (diff.tv_usec / 1000)); 71 break; 72 73 default: 74 /* reaching here is something disaster */ 75 fprintf(stderr, "Unknown format:%d\n", bench_format); 76 exit(1); 77 break; 78 } 79 80 return 0; 81 } 82