forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
81 lines
1.7 KiB
81 lines
1.7 KiB
/* |
|
* |
|
* 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", |
|
(unsigned long) diff.tv_sec, |
|
(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", |
|
(unsigned long) diff.tv_sec, |
|
(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; |
|
}
|
|
|