4 #include "benchmark/benchmark.h"
5 #include "output_test.h"
7 // @todo: <jpmag> this checks the full output at once; the rule for
8 // CounterSet1 was failing because it was not matching "^[-]+$".
9 // @todo: <jpmag> check that the counters are vertically aligned.
10 ADD_CASES(TC_ConsoleOut
,
12 // keeping these lines long improves readability, so:
15 {"^Benchmark %s Time %s CPU %s Iterations %s Bar %s Bat %s Baz %s Foo %s Frob %s Lob$", MR_Next
},
17 {"^BM_Counters_Tabular/repeats:2/threads:1 %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next
},
18 {"^BM_Counters_Tabular/repeats:2/threads:1 %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next
},
19 {"^BM_Counters_Tabular/repeats:2/threads:1_mean %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next
},
20 {"^BM_Counters_Tabular/repeats:2/threads:1_median %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next
},
21 {"^BM_Counters_Tabular/repeats:2/threads:1_stddev %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next
},
22 {"^BM_Counters_Tabular/repeats:2/threads:1_cv %console_percentage_report [ ]*%percentage[ ]*% [ ]*%percentage[ ]*% [ ]*%percentage[ ]*% [ ]*%percentage[ ]*% [ ]*%percentage[ ]*% [ ]*%percentage[ ]*%$", MR_Next
},
23 {"^BM_Counters_Tabular/repeats:2/threads:2 %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next
},
24 {"^BM_Counters_Tabular/repeats:2/threads:2 %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next
},
25 {"^BM_Counters_Tabular/repeats:2/threads:2_mean %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next
},
26 {"^BM_Counters_Tabular/repeats:2/threads:2_median %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next
},
27 {"^BM_Counters_Tabular/repeats:2/threads:2_stddev %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next
},
28 {"^BM_Counters_Tabular/repeats:2/threads:2_cv %console_percentage_report [ ]*%percentage[ ]*% [ ]*%percentage[ ]*% [ ]*%percentage[ ]*% [ ]*%percentage[ ]*% [ ]*%percentage[ ]*% [ ]*%percentage[ ]*%$", MR_Next
},
29 {"^BM_CounterRates_Tabular/threads:%int %console_report [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s$", MR_Next
},
30 {"^BM_CounterRates_Tabular/threads:%int %console_report [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s$", MR_Next
},
31 {"^BM_CounterRates_Tabular/threads:%int %console_report [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s$", MR_Next
},
32 {"^BM_CounterRates_Tabular/threads:%int %console_report [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s$", MR_Next
},
33 {"^BM_CounterRates_Tabular/threads:%int %console_report [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s$", MR_Next
},
35 {"^Benchmark %s Time %s CPU %s Iterations %s Bar %s Baz %s Foo$", MR_Next
},
37 {"^BM_CounterSet0_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next
},
38 {"^BM_CounterSet0_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next
},
39 {"^BM_CounterSet0_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next
},
40 {"^BM_CounterSet0_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next
},
41 {"^BM_CounterSet0_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next
},
42 {"^BM_CounterSet1_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next
},
43 {"^BM_CounterSet1_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next
},
44 {"^BM_CounterSet1_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next
},
45 {"^BM_CounterSet1_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next
},
46 {"^BM_CounterSet1_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next
},
48 {"^Benchmark %s Time %s CPU %s Iterations %s Bat %s Baz %s Foo$", MR_Next
},
50 {"^BM_CounterSet2_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next
},
51 {"^BM_CounterSet2_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next
},
52 {"^BM_CounterSet2_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next
},
53 {"^BM_CounterSet2_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next
},
54 {"^BM_CounterSet2_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$"},
57 ADD_CASES(TC_CSVOut
, {{"%csv_header,"
58 "\"Bar\",\"Bat\",\"Baz\",\"Foo\",\"Frob\",\"Lob\""}});
60 // ========================================================================= //
61 // ------------------------- Tabular Counters Output ----------------------- //
62 // ========================================================================= //
64 void BM_Counters_Tabular(benchmark::State
& state
) {
65 for (auto _
: state
) {
67 namespace bm
= benchmark
;
68 state
.counters
.insert({
69 {"Foo", {1, bm::Counter::kAvgThreads
}},
70 {"Bar", {2, bm::Counter::kAvgThreads
}},
71 {"Baz", {4, bm::Counter::kAvgThreads
}},
72 {"Bat", {8, bm::Counter::kAvgThreads
}},
73 {"Frob", {16, bm::Counter::kAvgThreads
}},
74 {"Lob", {32, bm::Counter::kAvgThreads
}},
77 BENCHMARK(BM_Counters_Tabular
)->ThreadRange(1, 2)->Repetitions(2);
79 {{"\"name\": \"BM_Counters_Tabular/repeats:2/threads:1\",$"},
80 {"\"family_index\": 0,$", MR_Next
},
81 {"\"per_family_instance_index\": 0,$", MR_Next
},
82 {"\"run_name\": \"BM_Counters_Tabular/repeats:2/threads:1\",$",
84 {"\"run_type\": \"iteration\",$", MR_Next
},
85 {"\"repetitions\": 2,$", MR_Next
},
86 {"\"repetition_index\": 0,$", MR_Next
},
87 {"\"threads\": 1,$", MR_Next
},
88 {"\"iterations\": %int,$", MR_Next
},
89 {"\"real_time\": %float,$", MR_Next
},
90 {"\"cpu_time\": %float,$", MR_Next
},
91 {"\"time_unit\": \"ns\",$", MR_Next
},
92 {"\"Bar\": %float,$", MR_Next
},
93 {"\"Bat\": %float,$", MR_Next
},
94 {"\"Baz\": %float,$", MR_Next
},
95 {"\"Foo\": %float,$", MR_Next
},
96 {"\"Frob\": %float,$", MR_Next
},
97 {"\"Lob\": %float$", MR_Next
},
100 {{"\"name\": \"BM_Counters_Tabular/repeats:2/threads:1\",$"},
101 {"\"family_index\": 0,$", MR_Next
},
102 {"\"per_family_instance_index\": 0,$", MR_Next
},
103 {"\"run_name\": \"BM_Counters_Tabular/repeats:2/threads:1\",$",
105 {"\"run_type\": \"iteration\",$", MR_Next
},
106 {"\"repetitions\": 2,$", MR_Next
},
107 {"\"repetition_index\": 1,$", MR_Next
},
108 {"\"threads\": 1,$", MR_Next
},
109 {"\"iterations\": %int,$", MR_Next
},
110 {"\"real_time\": %float,$", MR_Next
},
111 {"\"cpu_time\": %float,$", MR_Next
},
112 {"\"time_unit\": \"ns\",$", MR_Next
},
113 {"\"Bar\": %float,$", MR_Next
},
114 {"\"Bat\": %float,$", MR_Next
},
115 {"\"Baz\": %float,$", MR_Next
},
116 {"\"Foo\": %float,$", MR_Next
},
117 {"\"Frob\": %float,$", MR_Next
},
118 {"\"Lob\": %float$", MR_Next
},
120 ADD_CASES(TC_JSONOut
,
121 {{"\"name\": \"BM_Counters_Tabular/repeats:2/threads:1_mean\",$"},
122 {"\"family_index\": 0,$", MR_Next
},
123 {"\"per_family_instance_index\": 0,$", MR_Next
},
124 {"\"run_name\": \"BM_Counters_Tabular/repeats:2/threads:1\",$",
126 {"\"run_type\": \"aggregate\",$", MR_Next
},
127 {"\"repetitions\": 2,$", MR_Next
},
128 {"\"threads\": 1,$", MR_Next
},
129 {"\"aggregate_name\": \"mean\",$", MR_Next
},
130 {"\"aggregate_unit\": \"time\",$", MR_Next
},
131 {"\"iterations\": %int,$", MR_Next
},
132 {"\"real_time\": %float,$", MR_Next
},
133 {"\"cpu_time\": %float,$", MR_Next
},
134 {"\"time_unit\": \"ns\",$", MR_Next
},
135 {"\"Bar\": %float,$", MR_Next
},
136 {"\"Bat\": %float,$", MR_Next
},
137 {"\"Baz\": %float,$", MR_Next
},
138 {"\"Foo\": %float,$", MR_Next
},
139 {"\"Frob\": %float,$", MR_Next
},
140 {"\"Lob\": %float$", MR_Next
},
142 ADD_CASES(TC_JSONOut
,
143 {{"\"name\": \"BM_Counters_Tabular/repeats:2/threads:1_median\",$"},
144 {"\"family_index\": 0,$", MR_Next
},
145 {"\"per_family_instance_index\": 0,$", MR_Next
},
146 {"\"run_name\": \"BM_Counters_Tabular/repeats:2/threads:1\",$",
148 {"\"run_type\": \"aggregate\",$", MR_Next
},
149 {"\"repetitions\": 2,$", MR_Next
},
150 {"\"threads\": 1,$", MR_Next
},
151 {"\"aggregate_name\": \"median\",$", MR_Next
},
152 {"\"aggregate_unit\": \"time\",$", MR_Next
},
153 {"\"iterations\": %int,$", MR_Next
},
154 {"\"real_time\": %float,$", MR_Next
},
155 {"\"cpu_time\": %float,$", MR_Next
},
156 {"\"time_unit\": \"ns\",$", MR_Next
},
157 {"\"Bar\": %float,$", MR_Next
},
158 {"\"Bat\": %float,$", MR_Next
},
159 {"\"Baz\": %float,$", MR_Next
},
160 {"\"Foo\": %float,$", MR_Next
},
161 {"\"Frob\": %float,$", MR_Next
},
162 {"\"Lob\": %float$", MR_Next
},
164 ADD_CASES(TC_JSONOut
,
165 {{"\"name\": \"BM_Counters_Tabular/repeats:2/threads:1_stddev\",$"},
166 {"\"family_index\": 0,$", MR_Next
},
167 {"\"per_family_instance_index\": 0,$", MR_Next
},
168 {"\"run_name\": \"BM_Counters_Tabular/repeats:2/threads:1\",$",
170 {"\"run_type\": \"aggregate\",$", MR_Next
},
171 {"\"repetitions\": 2,$", MR_Next
},
172 {"\"threads\": 1,$", MR_Next
},
173 {"\"aggregate_name\": \"stddev\",$", MR_Next
},
174 {"\"aggregate_unit\": \"time\",$", MR_Next
},
175 {"\"iterations\": %int,$", MR_Next
},
176 {"\"real_time\": %float,$", MR_Next
},
177 {"\"cpu_time\": %float,$", MR_Next
},
178 {"\"time_unit\": \"ns\",$", MR_Next
},
179 {"\"Bar\": %float,$", MR_Next
},
180 {"\"Bat\": %float,$", MR_Next
},
181 {"\"Baz\": %float,$", MR_Next
},
182 {"\"Foo\": %float,$", MR_Next
},
183 {"\"Frob\": %float,$", MR_Next
},
184 {"\"Lob\": %float$", MR_Next
},
186 ADD_CASES(TC_JSONOut
,
187 {{"\"name\": \"BM_Counters_Tabular/repeats:2/threads:1_cv\",$"},
188 {"\"family_index\": 0,$", MR_Next
},
189 {"\"per_family_instance_index\": 0,$", MR_Next
},
190 {"\"run_name\": \"BM_Counters_Tabular/repeats:2/threads:1\",$",
192 {"\"run_type\": \"aggregate\",$", MR_Next
},
193 {"\"repetitions\": 2,$", MR_Next
},
194 {"\"threads\": 1,$", MR_Next
},
195 {"\"aggregate_name\": \"cv\",$", MR_Next
},
196 {"\"aggregate_unit\": \"percentage\",$", MR_Next
},
197 {"\"iterations\": %int,$", MR_Next
},
198 {"\"real_time\": %float,$", MR_Next
},
199 {"\"cpu_time\": %float,$", MR_Next
},
200 {"\"time_unit\": \"ns\",$", MR_Next
},
201 {"\"Bar\": %float,$", MR_Next
},
202 {"\"Bat\": %float,$", MR_Next
},
203 {"\"Baz\": %float,$", MR_Next
},
204 {"\"Foo\": %float,$", MR_Next
},
205 {"\"Frob\": %float,$", MR_Next
},
206 {"\"Lob\": %float$", MR_Next
},
209 ADD_CASES(TC_JSONOut
,
210 {{"\"name\": \"BM_Counters_Tabular/repeats:2/threads:2\",$"},
211 {"\"family_index\": 0,$", MR_Next
},
212 {"\"per_family_instance_index\": 1,$", MR_Next
},
213 {"\"run_name\": \"BM_Counters_Tabular/repeats:2/threads:2\",$",
215 {"\"run_type\": \"iteration\",$", MR_Next
},
216 {"\"repetitions\": 2,$", MR_Next
},
217 {"\"repetition_index\": 0,$", MR_Next
},
218 {"\"threads\": 2,$", MR_Next
},
219 {"\"iterations\": %int,$", MR_Next
},
220 {"\"real_time\": %float,$", MR_Next
},
221 {"\"cpu_time\": %float,$", MR_Next
},
222 {"\"time_unit\": \"ns\",$", MR_Next
},
223 {"\"Bar\": %float,$", MR_Next
},
224 {"\"Bat\": %float,$", MR_Next
},
225 {"\"Baz\": %float,$", MR_Next
},
226 {"\"Foo\": %float,$", MR_Next
},
227 {"\"Frob\": %float,$", MR_Next
},
228 {"\"Lob\": %float$", MR_Next
},
230 ADD_CASES(TC_JSONOut
,
231 {{"\"name\": \"BM_Counters_Tabular/repeats:2/threads:2\",$"},
232 {"\"family_index\": 0,$", MR_Next
},
233 {"\"per_family_instance_index\": 1,$", MR_Next
},
234 {"\"run_name\": \"BM_Counters_Tabular/repeats:2/threads:2\",$",
236 {"\"run_type\": \"iteration\",$", MR_Next
},
237 {"\"repetitions\": 2,$", MR_Next
},
238 {"\"repetition_index\": 1,$", MR_Next
},
239 {"\"threads\": 2,$", MR_Next
},
240 {"\"iterations\": %int,$", MR_Next
},
241 {"\"real_time\": %float,$", MR_Next
},
242 {"\"cpu_time\": %float,$", MR_Next
},
243 {"\"time_unit\": \"ns\",$", MR_Next
},
244 {"\"Bar\": %float,$", MR_Next
},
245 {"\"Bat\": %float,$", MR_Next
},
246 {"\"Baz\": %float,$", MR_Next
},
247 {"\"Foo\": %float,$", MR_Next
},
248 {"\"Frob\": %float,$", MR_Next
},
249 {"\"Lob\": %float$", MR_Next
},
251 ADD_CASES(TC_JSONOut
,
252 {{"\"name\": \"BM_Counters_Tabular/repeats:2/threads:2_median\",$"},
253 {"\"family_index\": 0,$", MR_Next
},
254 {"\"per_family_instance_index\": 1,$", MR_Next
},
255 {"\"run_name\": \"BM_Counters_Tabular/repeats:2/threads:2\",$",
257 {"\"run_type\": \"aggregate\",$", MR_Next
},
258 {"\"repetitions\": 2,$", MR_Next
},
259 {"\"threads\": 2,$", MR_Next
},
260 {"\"aggregate_name\": \"median\",$", MR_Next
},
261 {"\"aggregate_unit\": \"time\",$", MR_Next
},
262 {"\"iterations\": %int,$", MR_Next
},
263 {"\"real_time\": %float,$", MR_Next
},
264 {"\"cpu_time\": %float,$", MR_Next
},
265 {"\"time_unit\": \"ns\",$", MR_Next
},
266 {"\"Bar\": %float,$", MR_Next
},
267 {"\"Bat\": %float,$", MR_Next
},
268 {"\"Baz\": %float,$", MR_Next
},
269 {"\"Foo\": %float,$", MR_Next
},
270 {"\"Frob\": %float,$", MR_Next
},
271 {"\"Lob\": %float$", MR_Next
},
273 ADD_CASES(TC_JSONOut
,
274 {{"\"name\": \"BM_Counters_Tabular/repeats:2/threads:2_stddev\",$"},
275 {"\"family_index\": 0,$", MR_Next
},
276 {"\"per_family_instance_index\": 1,$", MR_Next
},
277 {"\"run_name\": \"BM_Counters_Tabular/repeats:2/threads:2\",$",
279 {"\"run_type\": \"aggregate\",$", MR_Next
},
280 {"\"repetitions\": 2,$", MR_Next
},
281 {"\"threads\": 2,$", MR_Next
},
282 {"\"aggregate_name\": \"stddev\",$", MR_Next
},
283 {"\"aggregate_unit\": \"time\",$", MR_Next
},
284 {"\"iterations\": %int,$", MR_Next
},
285 {"\"real_time\": %float,$", MR_Next
},
286 {"\"cpu_time\": %float,$", MR_Next
},
287 {"\"time_unit\": \"ns\",$", MR_Next
},
288 {"\"Bar\": %float,$", MR_Next
},
289 {"\"Bat\": %float,$", MR_Next
},
290 {"\"Baz\": %float,$", MR_Next
},
291 {"\"Foo\": %float,$", MR_Next
},
292 {"\"Frob\": %float,$", MR_Next
},
293 {"\"Lob\": %float$", MR_Next
},
295 ADD_CASES(TC_JSONOut
,
296 {{"\"name\": \"BM_Counters_Tabular/repeats:2/threads:2_cv\",$"},
297 {"\"family_index\": 0,$", MR_Next
},
298 {"\"per_family_instance_index\": 1,$", MR_Next
},
299 {"\"run_name\": \"BM_Counters_Tabular/repeats:2/threads:2\",$",
301 {"\"run_type\": \"aggregate\",$", MR_Next
},
302 {"\"repetitions\": 2,$", MR_Next
},
303 {"\"threads\": 2,$", MR_Next
},
304 {"\"aggregate_name\": \"cv\",$", MR_Next
},
305 {"\"aggregate_unit\": \"percentage\",$", MR_Next
},
306 {"\"iterations\": %int,$", MR_Next
},
307 {"\"real_time\": %float,$", MR_Next
},
308 {"\"cpu_time\": %float,$", MR_Next
},
309 {"\"time_unit\": \"ns\",$", MR_Next
},
310 {"\"Bar\": %float,$", MR_Next
},
311 {"\"Bat\": %float,$", MR_Next
},
312 {"\"Baz\": %float,$", MR_Next
},
313 {"\"Foo\": %float,$", MR_Next
},
314 {"\"Frob\": %float,$", MR_Next
},
315 {"\"Lob\": %float$", MR_Next
},
318 {{"^\"BM_Counters_Tabular/repeats:2/threads:1\",%csv_report,"
319 "%float,%float,%float,%float,%float,%float$"}});
321 {{"^\"BM_Counters_Tabular/repeats:2/threads:1\",%csv_report,"
322 "%float,%float,%float,%float,%float,%float$"}});
324 {{"^\"BM_Counters_Tabular/repeats:2/threads:1_mean\",%csv_report,"
325 "%float,%float,%float,%float,%float,%float$"}});
327 {{"^\"BM_Counters_Tabular/repeats:2/threads:1_median\",%csv_report,"
328 "%float,%float,%float,%float,%float,%float$"}});
330 {{"^\"BM_Counters_Tabular/repeats:2/threads:1_stddev\",%csv_report,"
331 "%float,%float,%float,%float,%float,%float$"}});
333 {{"^\"BM_Counters_Tabular/repeats:2/threads:1_cv\",%csv_report,"
334 "%float,%float,%float,%float,%float,%float$"}});
336 {{"^\"BM_Counters_Tabular/repeats:2/threads:2\",%csv_report,"
337 "%float,%float,%float,%float,%float,%float$"}});
339 {{"^\"BM_Counters_Tabular/repeats:2/threads:2\",%csv_report,"
340 "%float,%float,%float,%float,%float,%float$"}});
342 {{"^\"BM_Counters_Tabular/repeats:2/threads:2_mean\",%csv_report,"
343 "%float,%float,%float,%float,%float,%float$"}});
345 {{"^\"BM_Counters_Tabular/repeats:2/threads:2_median\",%csv_report,"
346 "%float,%float,%float,%float,%float,%float$"}});
348 {{"^\"BM_Counters_Tabular/repeats:2/threads:2_stddev\",%csv_report,"
349 "%float,%float,%float,%float,%float,%float$"}});
351 {{"^\"BM_Counters_Tabular/repeats:2/threads:2_cv\",%csv_report,"
352 "%float,%float,%float,%float,%float,%float$"}});
353 // VS2013 does not allow this function to be passed as a lambda argument
354 // to CHECK_BENCHMARK_RESULTS()
355 void CheckTabular(Results
const& e
) {
356 CHECK_COUNTER_VALUE(e
, int, "Foo", EQ
, 1);
357 CHECK_COUNTER_VALUE(e
, int, "Bar", EQ
, 2);
358 CHECK_COUNTER_VALUE(e
, int, "Baz", EQ
, 4);
359 CHECK_COUNTER_VALUE(e
, int, "Bat", EQ
, 8);
360 CHECK_COUNTER_VALUE(e
, int, "Frob", EQ
, 16);
361 CHECK_COUNTER_VALUE(e
, int, "Lob", EQ
, 32);
363 CHECK_BENCHMARK_RESULTS("BM_Counters_Tabular/repeats:2/threads:1$",
365 CHECK_BENCHMARK_RESULTS("BM_Counters_Tabular/repeats:2/threads:2$",
368 // ========================================================================= //
369 // -------------------- Tabular+Rate Counters Output ----------------------- //
370 // ========================================================================= //
372 void BM_CounterRates_Tabular(benchmark::State
& state
) {
373 for (auto _
: state
) {
374 // This test requires a non-zero CPU time to avoid divide-by-zero
375 benchmark::DoNotOptimize(state
.iterations());
377 namespace bm
= benchmark
;
378 state
.counters
.insert({
379 {"Foo", {1, bm::Counter::kAvgThreadsRate
}},
380 {"Bar", {2, bm::Counter::kAvgThreadsRate
}},
381 {"Baz", {4, bm::Counter::kAvgThreadsRate
}},
382 {"Bat", {8, bm::Counter::kAvgThreadsRate
}},
383 {"Frob", {16, bm::Counter::kAvgThreadsRate
}},
384 {"Lob", {32, bm::Counter::kAvgThreadsRate
}},
387 BENCHMARK(BM_CounterRates_Tabular
)->ThreadRange(1, 16);
388 ADD_CASES(TC_JSONOut
,
389 {{"\"name\": \"BM_CounterRates_Tabular/threads:%int\",$"},
390 {"\"family_index\": 1,$", MR_Next
},
391 {"\"per_family_instance_index\": 0,$", MR_Next
},
392 {"\"run_name\": \"BM_CounterRates_Tabular/threads:%int\",$",
394 {"\"run_type\": \"iteration\",$", MR_Next
},
395 {"\"repetitions\": 1,$", MR_Next
},
396 {"\"repetition_index\": 0,$", MR_Next
},
397 {"\"threads\": 1,$", MR_Next
},
398 {"\"iterations\": %int,$", MR_Next
},
399 {"\"real_time\": %float,$", MR_Next
},
400 {"\"cpu_time\": %float,$", MR_Next
},
401 {"\"time_unit\": \"ns\",$", MR_Next
},
402 {"\"Bar\": %float,$", MR_Next
},
403 {"\"Bat\": %float,$", MR_Next
},
404 {"\"Baz\": %float,$", MR_Next
},
405 {"\"Foo\": %float,$", MR_Next
},
406 {"\"Frob\": %float,$", MR_Next
},
407 {"\"Lob\": %float$", MR_Next
},
409 ADD_CASES(TC_CSVOut
, {{"^\"BM_CounterRates_Tabular/threads:%int\",%csv_report,"
410 "%float,%float,%float,%float,%float,%float$"}});
411 // VS2013 does not allow this function to be passed as a lambda argument
412 // to CHECK_BENCHMARK_RESULTS()
413 void CheckTabularRate(Results
const& e
) {
414 double t
= e
.DurationCPUTime();
415 CHECK_FLOAT_COUNTER_VALUE(e
, "Foo", EQ
, 1. / t
, 0.001);
416 CHECK_FLOAT_COUNTER_VALUE(e
, "Bar", EQ
, 2. / t
, 0.001);
417 CHECK_FLOAT_COUNTER_VALUE(e
, "Baz", EQ
, 4. / t
, 0.001);
418 CHECK_FLOAT_COUNTER_VALUE(e
, "Bat", EQ
, 8. / t
, 0.001);
419 CHECK_FLOAT_COUNTER_VALUE(e
, "Frob", EQ
, 16. / t
, 0.001);
420 CHECK_FLOAT_COUNTER_VALUE(e
, "Lob", EQ
, 32. / t
, 0.001);
422 CHECK_BENCHMARK_RESULTS("BM_CounterRates_Tabular/threads:%int",
425 // ========================================================================= //
426 // ------------------------- Tabular Counters Output ----------------------- //
427 // ========================================================================= //
429 // set only some of the counters
430 void BM_CounterSet0_Tabular(benchmark::State
& state
) {
431 for (auto _
: state
) {
433 namespace bm
= benchmark
;
434 state
.counters
.insert({
435 {"Foo", {10, bm::Counter::kAvgThreads
}},
436 {"Bar", {20, bm::Counter::kAvgThreads
}},
437 {"Baz", {40, bm::Counter::kAvgThreads
}},
440 BENCHMARK(BM_CounterSet0_Tabular
)->ThreadRange(1, 16);
441 ADD_CASES(TC_JSONOut
,
442 {{"\"name\": \"BM_CounterSet0_Tabular/threads:%int\",$"},
443 {"\"family_index\": 2,$", MR_Next
},
444 {"\"per_family_instance_index\": 0,$", MR_Next
},
445 {"\"run_name\": \"BM_CounterSet0_Tabular/threads:%int\",$", MR_Next
},
446 {"\"run_type\": \"iteration\",$", MR_Next
},
447 {"\"repetitions\": 1,$", MR_Next
},
448 {"\"repetition_index\": 0,$", MR_Next
},
449 {"\"threads\": 1,$", MR_Next
},
450 {"\"iterations\": %int,$", MR_Next
},
451 {"\"real_time\": %float,$", MR_Next
},
452 {"\"cpu_time\": %float,$", MR_Next
},
453 {"\"time_unit\": \"ns\",$", MR_Next
},
454 {"\"Bar\": %float,$", MR_Next
},
455 {"\"Baz\": %float,$", MR_Next
},
456 {"\"Foo\": %float$", MR_Next
},
458 ADD_CASES(TC_CSVOut
, {{"^\"BM_CounterSet0_Tabular/threads:%int\",%csv_report,"
459 "%float,,%float,%float,,"}});
460 // VS2013 does not allow this function to be passed as a lambda argument
461 // to CHECK_BENCHMARK_RESULTS()
462 void CheckSet0(Results
const& e
) {
463 CHECK_COUNTER_VALUE(e
, int, "Foo", EQ
, 10);
464 CHECK_COUNTER_VALUE(e
, int, "Bar", EQ
, 20);
465 CHECK_COUNTER_VALUE(e
, int, "Baz", EQ
, 40);
467 CHECK_BENCHMARK_RESULTS("BM_CounterSet0_Tabular", &CheckSet0
);
470 void BM_CounterSet1_Tabular(benchmark::State
& state
) {
471 for (auto _
: state
) {
473 namespace bm
= benchmark
;
474 state
.counters
.insert({
475 {"Foo", {15, bm::Counter::kAvgThreads
}},
476 {"Bar", {25, bm::Counter::kAvgThreads
}},
477 {"Baz", {45, bm::Counter::kAvgThreads
}},
480 BENCHMARK(BM_CounterSet1_Tabular
)->ThreadRange(1, 16);
481 ADD_CASES(TC_JSONOut
,
482 {{"\"name\": \"BM_CounterSet1_Tabular/threads:%int\",$"},
483 {"\"family_index\": 3,$", MR_Next
},
484 {"\"per_family_instance_index\": 0,$", MR_Next
},
485 {"\"run_name\": \"BM_CounterSet1_Tabular/threads:%int\",$", MR_Next
},
486 {"\"run_type\": \"iteration\",$", MR_Next
},
487 {"\"repetitions\": 1,$", MR_Next
},
488 {"\"repetition_index\": 0,$", MR_Next
},
489 {"\"threads\": 1,$", MR_Next
},
490 {"\"iterations\": %int,$", MR_Next
},
491 {"\"real_time\": %float,$", MR_Next
},
492 {"\"cpu_time\": %float,$", MR_Next
},
493 {"\"time_unit\": \"ns\",$", MR_Next
},
494 {"\"Bar\": %float,$", MR_Next
},
495 {"\"Baz\": %float,$", MR_Next
},
496 {"\"Foo\": %float$", MR_Next
},
498 ADD_CASES(TC_CSVOut
, {{"^\"BM_CounterSet1_Tabular/threads:%int\",%csv_report,"
499 "%float,,%float,%float,,"}});
500 // VS2013 does not allow this function to be passed as a lambda argument
501 // to CHECK_BENCHMARK_RESULTS()
502 void CheckSet1(Results
const& e
) {
503 CHECK_COUNTER_VALUE(e
, int, "Foo", EQ
, 15);
504 CHECK_COUNTER_VALUE(e
, int, "Bar", EQ
, 25);
505 CHECK_COUNTER_VALUE(e
, int, "Baz", EQ
, 45);
507 CHECK_BENCHMARK_RESULTS("BM_CounterSet1_Tabular/threads:%int", &CheckSet1
);
509 // ========================================================================= //
510 // ------------------------- Tabular Counters Output ----------------------- //
511 // ========================================================================= //
513 // set only some of the counters, different set now.
514 void BM_CounterSet2_Tabular(benchmark::State
& state
) {
515 for (auto _
: state
) {
517 namespace bm
= benchmark
;
518 state
.counters
.insert({
519 {"Foo", {10, bm::Counter::kAvgThreads
}},
520 {"Bat", {30, bm::Counter::kAvgThreads
}},
521 {"Baz", {40, bm::Counter::kAvgThreads
}},
524 BENCHMARK(BM_CounterSet2_Tabular
)->ThreadRange(1, 16);
525 ADD_CASES(TC_JSONOut
,
526 {{"\"name\": \"BM_CounterSet2_Tabular/threads:%int\",$"},
527 {"\"family_index\": 4,$", MR_Next
},
528 {"\"per_family_instance_index\": 0,$", MR_Next
},
529 {"\"run_name\": \"BM_CounterSet2_Tabular/threads:%int\",$", MR_Next
},
530 {"\"run_type\": \"iteration\",$", MR_Next
},
531 {"\"repetitions\": 1,$", MR_Next
},
532 {"\"repetition_index\": 0,$", MR_Next
},
533 {"\"threads\": 1,$", MR_Next
},
534 {"\"iterations\": %int,$", MR_Next
},
535 {"\"real_time\": %float,$", MR_Next
},
536 {"\"cpu_time\": %float,$", MR_Next
},
537 {"\"time_unit\": \"ns\",$", MR_Next
},
538 {"\"Bat\": %float,$", MR_Next
},
539 {"\"Baz\": %float,$", MR_Next
},
540 {"\"Foo\": %float$", MR_Next
},
542 ADD_CASES(TC_CSVOut
, {{"^\"BM_CounterSet2_Tabular/threads:%int\",%csv_report,"
543 ",%float,%float,%float,,"}});
544 // VS2013 does not allow this function to be passed as a lambda argument
545 // to CHECK_BENCHMARK_RESULTS()
546 void CheckSet2(Results
const& e
) {
547 CHECK_COUNTER_VALUE(e
, int, "Foo", EQ
, 10);
548 CHECK_COUNTER_VALUE(e
, int, "Bat", EQ
, 30);
549 CHECK_COUNTER_VALUE(e
, int, "Baz", EQ
, 40);
551 CHECK_BENCHMARK_RESULTS("BM_CounterSet2_Tabular", &CheckSet2
);
553 // ========================================================================= //
554 // --------------------------- TEST CASES END ------------------------------ //
555 // ========================================================================= //
557 int main(int argc
, char* argv
[]) { RunOutputTests(argc
, argv
); }