18
18
19
19
unsigned long long timing (clockid_t clk_id , unsigned long long samples )
20
20
{
21
- pid_t pid , ret ;
22
- unsigned long long i ;
23
21
struct timespec start , finish ;
22
+ unsigned long long i ;
23
+ pid_t pid , ret ;
24
24
25
25
pid = getpid ();
26
26
assert (clock_gettime (clk_id , & start ) == 0 );
@@ -31,30 +31,43 @@ unsigned long long timing(clockid_t clk_id, unsigned long long samples)
31
31
assert (clock_gettime (clk_id , & finish ) == 0 );
32
32
33
33
i = finish .tv_sec - start .tv_sec ;
34
- i *= 1000000000 ;
34
+ i *= 1000000000ULL ;
35
35
i += finish .tv_nsec - start .tv_nsec ;
36
36
37
- printf ("%lu.%09lu - %lu.%09lu = %llu\n" ,
37
+ printf ("%lu.%09lu - %lu.%09lu = %llu (%.1fs) \n" ,
38
38
finish .tv_sec , finish .tv_nsec ,
39
39
start .tv_sec , start .tv_nsec ,
40
- i );
40
+ i , ( double ) i / 1000000000.0 );
41
41
42
42
return i ;
43
43
}
44
44
45
45
unsigned long long calibrate (void )
46
46
{
47
- unsigned long long i ;
48
-
49
- printf ("Calibrating reasonable sample size...\n" );
47
+ struct timespec start , finish ;
48
+ unsigned long long i , samples , step = 9973 ;
49
+ pid_t pid , ret ;
50
+ int seconds = 15 ;
50
51
51
- for (i = 5 ; ; i ++ ) {
52
- unsigned long long samples = 1 << i ;
52
+ printf ("Calibrating sample size for %d seconds worth of syscalls ...\n" , seconds );
53
53
54
- /* Find something that takes more than 5 seconds to run. */
55
- if (timing (CLOCK_REALTIME , samples ) / 1000000000ULL > 5 )
56
- return samples ;
57
- }
54
+ samples = 0 ;
55
+ pid = getpid ();
56
+ assert (clock_gettime (CLOCK_MONOTONIC , & start ) == 0 );
57
+ do {
58
+ for (i = 0 ; i < step ; i ++ ) {
59
+ ret = syscall (__NR_getpid );
60
+ assert (pid == ret );
61
+ }
62
+ assert (clock_gettime (CLOCK_MONOTONIC , & finish ) == 0 );
63
+
64
+ samples += step ;
65
+ i = finish .tv_sec - start .tv_sec ;
66
+ i *= 1000000000ULL ;
67
+ i += finish .tv_nsec - start .tv_nsec ;
68
+ } while (i < 1000000000ULL );
69
+
70
+ return samples * seconds ;
58
71
}
59
72
60
73
int main (int argc , char * argv [])
@@ -70,15 +83,16 @@ int main(int argc, char *argv[])
70
83
unsigned long long samples ;
71
84
unsigned long long native , filter1 , filter2 ;
72
85
86
+ printf ("Current BPF sysctl settings:\n" );
87
+ system ("sysctl net.core.bpf_jit_enable" );
88
+ system ("sysctl net.core.bpf_jit_harden" );
89
+
73
90
if (argc > 1 )
74
91
samples = strtoull (argv [1 ], NULL , 0 );
75
92
else
76
93
samples = calibrate ();
77
94
78
- printf ("Current BPF sysctl settings:\n" );
79
- system ("sysctl net.core.bpf_jit_enable" );
80
- system ("sysctl net.core.bpf_jit_harden" );
81
- printf ("Benchmarking %llu samples...\n" , samples );
95
+ printf ("Benchmarking %llu syscalls...\n" , samples );
82
96
83
97
/* Native call */
84
98
native = timing (CLOCK_PROCESS_CPUTIME_ID , samples ) / samples ;
0 commit comments