]>
Commit | Line | Data |
---|---|---|
8cfdb7e0 | 1 | /* Skeleton for benchmark programs. |
688903eb | 2 | Copyright (C) 2013-2018 Free Software Foundation, Inc. |
8cfdb7e0 SP |
3 | This file is part of the GNU C Library. |
4 | ||
5 | The GNU C Library is free software; you can redistribute it and/or | |
6 | modify it under the terms of the GNU Lesser General Public | |
7 | License as published by the Free Software Foundation; either | |
8 | version 2.1 of the License, or (at your option) any later version. | |
9 | ||
10 | The GNU C Library is distributed in the hope that it will be useful, | |
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 | Lesser General Public License for more details. | |
14 | ||
15 | You should have received a copy of the GNU Lesser General Public | |
16 | License along with the GNU C Library; if not, see | |
17 | <http://www.gnu.org/licenses/>. */ | |
18 | ||
19 | #include <string.h> | |
20 | #include <stdint.h> | |
56737508 | 21 | #include <stdbool.h> |
8cfdb7e0 SP |
22 | #include <stdio.h> |
23 | #include <time.h> | |
24 | #include <inttypes.h> | |
43fe811b | 25 | #include "bench-timing.h" |
970c602a | 26 | #include "json-lib.h" |
cb2f668d | 27 | #include "bench-util.h" |
8cfdb7e0 | 28 | |
cb2f668d | 29 | #include "bench-util.c" |
bb7cf681 | 30 | |
d569c6ee SP |
31 | #define TIMESPEC_AFTER(a, b) \ |
32 | (((a).tv_sec == (b).tv_sec) ? \ | |
33 | ((a).tv_nsec > (b).tv_nsec) : \ | |
f0ee064b | 34 | ((a).tv_sec > (b).tv_sec)) |
8cfdb7e0 SP |
35 | int |
36 | main (int argc, char **argv) | |
37 | { | |
d569c6ee | 38 | unsigned long i, k; |
43fe811b SP |
39 | struct timespec runtime; |
40 | timing_t start, end; | |
56737508 | 41 | bool detailed = false; |
970c602a | 42 | json_ctx_t json_ctx; |
56737508 SP |
43 | |
44 | if (argc == 2 && !strcmp (argv[1], "-d")) | |
45 | detailed = true; | |
8cfdb7e0 | 46 | |
cb2f668d | 47 | bench_start (); |
bb7cf681 | 48 | |
d569c6ee | 49 | memset (&runtime, 0, sizeof (runtime)); |
8cfdb7e0 | 50 | |
b987c776 | 51 | unsigned long iters, res; |
8cfdb7e0 | 52 | |
15eaf6ff SP |
53 | #ifdef BENCH_INIT |
54 | BENCH_INIT (); | |
55 | #endif | |
b987c776 WN |
56 | TIMING_INIT (res); |
57 | ||
58 | iters = 1000 * res; | |
8cfdb7e0 | 59 | |
970c602a WN |
60 | json_init (&json_ctx, 2, stdout); |
61 | ||
cb5e4aad | 62 | /* Begin function. */ |
970c602a | 63 | json_attr_object_begin (&json_ctx, FUNCNAME); |
cb5e4aad | 64 | |
f0ee064b | 65 | for (int v = 0; v < NUM_VARIANTS; v++) |
8cfdb7e0 | 66 | { |
f0ee064b SP |
67 | /* Run for approximately DURATION seconds. */ |
68 | clock_gettime (CLOCK_MONOTONIC_RAW, &runtime); | |
69 | runtime.tv_sec += DURATION; | |
8cfdb7e0 | 70 | |
beb52f50 | 71 | bool is_bench = strncmp (VARIANT (v), "workload-", 9) == 0; |
f0ee064b | 72 | double d_total_i = 0; |
43fe811b | 73 | timing_t total = 0, max = 0, min = 0x7fffffffffffffff; |
d4505b89 | 74 | timing_t throughput = 0, latency = 0; |
56737508 | 75 | int64_t c = 0; |
beb52f50 | 76 | uint64_t cur; |
d4505b89 | 77 | BENCH_VARS; |
f0ee064b SP |
78 | while (1) |
79 | { | |
beb52f50 | 80 | if (is_bench) |
f0ee064b | 81 | { |
beb52f50 WD |
82 | /* Benchmark a real trace of calls - all samples are iterated |
83 | over once before repeating. This models actual use more | |
84 | accurately than repeating the same sample many times. */ | |
43fe811b | 85 | TIMING_NOW (start); |
f0ee064b | 86 | for (k = 0; k < iters; k++) |
beb52f50 WD |
87 | for (i = 0; i < NUM_SAMPLES (v); i++) |
88 | BENCH_FUNC (v, i); | |
43fe811b | 89 | TIMING_NOW (end); |
43fe811b | 90 | TIMING_DIFF (cur, start, end); |
d4505b89 WD |
91 | TIMING_ACCUM (throughput, cur); |
92 | ||
93 | TIMING_NOW (start); | |
94 | for (k = 0; k < iters; k++) | |
95 | for (i = 0; i < NUM_SAMPLES (v); i++) | |
96 | BENCH_FUNC_LAT (v, i); | |
97 | TIMING_NOW (end); | |
98 | TIMING_DIFF (cur, start, end); | |
99 | TIMING_ACCUM (latency, cur); | |
100 | ||
beb52f50 WD |
101 | d_total_i += iters * NUM_SAMPLES (v); |
102 | } | |
103 | else | |
104 | for (i = 0; i < NUM_SAMPLES (v); i++) | |
105 | { | |
106 | TIMING_NOW (start); | |
107 | for (k = 0; k < iters; k++) | |
108 | BENCH_FUNC (v, i); | |
109 | TIMING_NOW (end); | |
8cfdb7e0 | 110 | |
beb52f50 | 111 | TIMING_DIFF (cur, start, end); |
8cfdb7e0 | 112 | |
beb52f50 WD |
113 | if (cur > max) |
114 | max = cur; | |
d569c6ee | 115 | |
beb52f50 WD |
116 | if (cur < min) |
117 | min = cur; | |
56737508 | 118 | |
beb52f50 WD |
119 | TIMING_ACCUM (total, cur); |
120 | /* Accumulate timings for the value. In the end we will divide | |
121 | by the total iterations. */ | |
122 | RESULT_ACCUM (cur, v, i, c * iters, (c + 1) * iters); | |
123 | ||
124 | d_total_i += iters; | |
125 | } | |
56737508 | 126 | c++; |
f0ee064b | 127 | struct timespec curtime; |
d569c6ee | 128 | |
f0ee064b SP |
129 | memset (&curtime, 0, sizeof (curtime)); |
130 | clock_gettime (CLOCK_MONOTONIC_RAW, &curtime); | |
131 | if (TIMESPEC_AFTER (curtime, runtime)) | |
132 | goto done; | |
133 | } | |
8cfdb7e0 | 134 | |
f0ee064b SP |
135 | double d_total_s; |
136 | double d_iters; | |
d569c6ee | 137 | |
f0ee064b | 138 | done: |
43fe811b | 139 | d_total_s = total; |
f0ee064b | 140 | d_iters = iters; |
d569c6ee | 141 | |
970c602a WN |
142 | /* Begin variant. */ |
143 | json_attr_object_begin (&json_ctx, VARIANT (v)); | |
144 | ||
beb52f50 | 145 | if (is_bench) |
d4505b89 WD |
146 | { |
147 | json_attr_double (&json_ctx, "reciprocal-throughput", | |
148 | throughput / d_total_i); | |
149 | json_attr_double (&json_ctx, "latency", latency / d_total_i); | |
150 | json_attr_double (&json_ctx, "max-throughput", | |
151 | d_total_i / throughput * 1000000000.0); | |
152 | json_attr_double (&json_ctx, "min-throughput", | |
153 | d_total_i / latency * 1000000000.0); | |
154 | } | |
beb52f50 WD |
155 | else |
156 | { | |
d4505b89 WD |
157 | json_attr_double (&json_ctx, "duration", d_total_s); |
158 | json_attr_double (&json_ctx, "iterations", d_total_i); | |
beb52f50 WD |
159 | json_attr_double (&json_ctx, "max", max / d_iters); |
160 | json_attr_double (&json_ctx, "min", min / d_iters); | |
161 | json_attr_double (&json_ctx, "mean", d_total_s / d_total_i); | |
162 | } | |
cb5e4aad | 163 | |
beb52f50 | 164 | if (detailed && !is_bench) |
56737508 | 165 | { |
970c602a WN |
166 | json_array_begin (&json_ctx, "timings"); |
167 | ||
56737508 | 168 | for (int i = 0; i < NUM_SAMPLES (v); i++) |
970c602a WN |
169 | json_element_double (&json_ctx, RESULT (v, i)); |
170 | ||
171 | json_array_end (&json_ctx); | |
56737508 | 172 | } |
970c602a WN |
173 | |
174 | /* End variant. */ | |
175 | json_attr_object_end (&json_ctx); | |
f0ee064b | 176 | } |
8cfdb7e0 | 177 | |
cb5e4aad | 178 | /* End function. */ |
970c602a | 179 | json_attr_object_end (&json_ctx); |
cb5e4aad | 180 | |
8cfdb7e0 SP |
181 | return 0; |
182 | } |