hc
2024-10-22 8ac6c7a54ed1b98d142dce24b11c6de6a1e239a5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
/*
 *
 * 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",
              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",
              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;
}