6 #include "benchmark/benchmark.h"
7 #include "output_test.h"
9 // ========================================================================= //
10 // ---------------------- Testing Prologue Output -------------------------- //
11 // ========================================================================= //
13 ADD_CASES(TC_ConsoleOut
, {{"^[-]+$", MR_Next
},
14 {"^Benchmark %s Time %s CPU %s Iterations$", MR_Next
},
15 {"^[-]+$", MR_Next
}});
16 static int AddContextCases() {
17 AddCases(TC_ConsoleErr
,
19 {"^%int-%int-%intT%int:%int:%int[-+]%int:%int$", MR_Default
},
20 {"Running .*(/|\\\\)reporter_output_test(\\.exe)?$", MR_Next
},
21 {"Run on \\(%int X %float MHz CPU s?\\)", MR_Next
},
24 {{"^\\{", MR_Default
},
25 {"\"context\":", MR_Next
},
26 {"\"date\": \"", MR_Next
},
27 {"\"host_name\":", MR_Next
},
28 {"\"executable\": \".*(/|\\\\)reporter_output_test(\\.exe)?\",",
30 {"\"num_cpus\": %int,$", MR_Next
},
31 {"\"mhz_per_cpu\": %float,$", MR_Next
},
32 {"\"caches\": \\[$", MR_Default
}});
33 auto const& Info
= benchmark::CPUInfo::Get();
34 auto const& Caches
= Info
.caches
;
35 if (!Caches
.empty()) {
36 AddCases(TC_ConsoleErr
, {{"CPU Caches:$", MR_Next
}});
38 for (size_t I
= 0; I
< Caches
.size(); ++I
) {
39 std::string num_caches_str
=
40 Caches
[I
].num_sharing
!= 0 ? " \\(x%int\\)$" : "$";
41 AddCases(TC_ConsoleErr
,
42 {{"L%int (Data|Instruction|Unified) %int KiB" + num_caches_str
,
44 AddCases(TC_JSONOut
, {{"\\{$", MR_Next
},
45 {"\"type\": \"", MR_Next
},
46 {"\"level\": %int,$", MR_Next
},
47 {"\"size\": %int,$", MR_Next
},
48 {"\"num_sharing\": %int$", MR_Next
},
49 {"}[,]{0,1}$", MR_Next
}});
51 AddCases(TC_JSONOut
, {{"],$"}});
52 auto const& LoadAvg
= Info
.load_avg
;
53 if (!LoadAvg
.empty()) {
54 AddCases(TC_ConsoleErr
,
55 {{"Load Average: (%float, ){0,2}%float$", MR_Next
}});
57 AddCases(TC_JSONOut
, {{"\"load_avg\": \\[(%float,?){0,3}],$", MR_Next
}});
58 AddCases(TC_JSONOut
, {{"\"library_version\": \".*\",$", MR_Next
}});
59 AddCases(TC_JSONOut
, {{"\"library_build_type\": \".*\",$", MR_Next
}});
60 AddCases(TC_JSONOut
, {{"\"json_schema_version\": 1$", MR_Next
}});
63 int dummy_register
= AddContextCases();
64 ADD_CASES(TC_CSVOut
, {{"%csv_header"}});
66 // ========================================================================= //
67 // ------------------------ Testing Basic Output --------------------------- //
68 // ========================================================================= //
70 void BM_basic(benchmark::State
& state
) {
71 for (auto _
: state
) {
76 ADD_CASES(TC_ConsoleOut
, {{"^BM_basic %console_report$"}});
77 ADD_CASES(TC_JSONOut
, {{"\"name\": \"BM_basic\",$"},
78 {"\"family_index\": 0,$", MR_Next
},
79 {"\"per_family_instance_index\": 0,$", MR_Next
},
80 {"\"run_name\": \"BM_basic\",$", MR_Next
},
81 {"\"run_type\": \"iteration\",$", MR_Next
},
82 {"\"repetitions\": 1,$", MR_Next
},
83 {"\"repetition_index\": 0,$", MR_Next
},
84 {"\"threads\": 1,$", MR_Next
},
85 {"\"iterations\": %int,$", MR_Next
},
86 {"\"real_time\": %float,$", MR_Next
},
87 {"\"cpu_time\": %float,$", MR_Next
},
88 {"\"time_unit\": \"ns\"$", MR_Next
},
90 ADD_CASES(TC_CSVOut
, {{"^\"BM_basic\",%csv_report$"}});
92 // ========================================================================= //
93 // ------------------------ Testing Bytes per Second Output ---------------- //
94 // ========================================================================= //
96 void BM_bytes_per_second(benchmark::State
& state
) {
97 for (auto _
: state
) {
98 // This test requires a non-zero CPU time to avoid divide-by-zero
99 auto iterations
= double(state
.iterations()) * double(state
.iterations());
100 benchmark::DoNotOptimize(iterations
);
102 state
.SetBytesProcessed(1);
104 BENCHMARK(BM_bytes_per_second
);
106 ADD_CASES(TC_ConsoleOut
, {{"^BM_bytes_per_second %console_report "
107 "bytes_per_second=%float[kM]{0,1}/s$"}});
108 ADD_CASES(TC_JSONOut
, {{"\"name\": \"BM_bytes_per_second\",$"},
109 {"\"family_index\": 1,$", MR_Next
},
110 {"\"per_family_instance_index\": 0,$", MR_Next
},
111 {"\"run_name\": \"BM_bytes_per_second\",$", MR_Next
},
112 {"\"run_type\": \"iteration\",$", MR_Next
},
113 {"\"repetitions\": 1,$", MR_Next
},
114 {"\"repetition_index\": 0,$", MR_Next
},
115 {"\"threads\": 1,$", MR_Next
},
116 {"\"iterations\": %int,$", MR_Next
},
117 {"\"real_time\": %float,$", MR_Next
},
118 {"\"cpu_time\": %float,$", MR_Next
},
119 {"\"time_unit\": \"ns\",$", MR_Next
},
120 {"\"bytes_per_second\": %float$", MR_Next
},
122 ADD_CASES(TC_CSVOut
, {{"^\"BM_bytes_per_second\",%csv_bytes_report$"}});
124 // ========================================================================= //
125 // ------------------------ Testing Items per Second Output ---------------- //
126 // ========================================================================= //
128 void BM_items_per_second(benchmark::State
& state
) {
129 for (auto _
: state
) {
130 // This test requires a non-zero CPU time to avoid divide-by-zero
131 auto iterations
= double(state
.iterations()) * double(state
.iterations());
132 benchmark::DoNotOptimize(iterations
);
134 state
.SetItemsProcessed(1);
136 BENCHMARK(BM_items_per_second
);
138 ADD_CASES(TC_ConsoleOut
, {{"^BM_items_per_second %console_report "
139 "items_per_second=%float[kM]{0,1}/s$"}});
140 ADD_CASES(TC_JSONOut
, {{"\"name\": \"BM_items_per_second\",$"},
141 {"\"family_index\": 2,$", MR_Next
},
142 {"\"per_family_instance_index\": 0,$", MR_Next
},
143 {"\"run_name\": \"BM_items_per_second\",$", MR_Next
},
144 {"\"run_type\": \"iteration\",$", MR_Next
},
145 {"\"repetitions\": 1,$", MR_Next
},
146 {"\"repetition_index\": 0,$", MR_Next
},
147 {"\"threads\": 1,$", MR_Next
},
148 {"\"iterations\": %int,$", MR_Next
},
149 {"\"real_time\": %float,$", MR_Next
},
150 {"\"cpu_time\": %float,$", MR_Next
},
151 {"\"time_unit\": \"ns\",$", MR_Next
},
152 {"\"items_per_second\": %float$", MR_Next
},
154 ADD_CASES(TC_CSVOut
, {{"^\"BM_items_per_second\",%csv_items_report$"}});
156 // ========================================================================= //
157 // ------------------------ Testing Label Output --------------------------- //
158 // ========================================================================= //
160 void BM_label(benchmark::State
& state
) {
161 for (auto _
: state
) {
163 state
.SetLabel("some label");
167 ADD_CASES(TC_ConsoleOut
, {{"^BM_label %console_report some label$"}});
168 ADD_CASES(TC_JSONOut
, {{"\"name\": \"BM_label\",$"},
169 {"\"family_index\": 3,$", MR_Next
},
170 {"\"per_family_instance_index\": 0,$", MR_Next
},
171 {"\"run_name\": \"BM_label\",$", MR_Next
},
172 {"\"run_type\": \"iteration\",$", MR_Next
},
173 {"\"repetitions\": 1,$", MR_Next
},
174 {"\"repetition_index\": 0,$", MR_Next
},
175 {"\"threads\": 1,$", MR_Next
},
176 {"\"iterations\": %int,$", MR_Next
},
177 {"\"real_time\": %float,$", MR_Next
},
178 {"\"cpu_time\": %float,$", MR_Next
},
179 {"\"time_unit\": \"ns\",$", MR_Next
},
180 {"\"label\": \"some label\"$", MR_Next
},
182 ADD_CASES(TC_CSVOut
, {{"^\"BM_label\",%csv_label_report_begin\"some "
183 "label\"%csv_label_report_end$"}});
185 // ========================================================================= //
186 // ------------------------ Testing Time Label Output ---------------------- //
187 // ========================================================================= //
189 void BM_time_label_nanosecond(benchmark::State
& state
) {
190 for (auto _
: state
) {
193 BENCHMARK(BM_time_label_nanosecond
)->Unit(benchmark::kNanosecond
);
195 ADD_CASES(TC_ConsoleOut
, {{"^BM_time_label_nanosecond %console_report$"}});
196 ADD_CASES(TC_JSONOut
,
197 {{"\"name\": \"BM_time_label_nanosecond\",$"},
198 {"\"family_index\": 4,$", MR_Next
},
199 {"\"per_family_instance_index\": 0,$", MR_Next
},
200 {"\"run_name\": \"BM_time_label_nanosecond\",$", MR_Next
},
201 {"\"run_type\": \"iteration\",$", MR_Next
},
202 {"\"repetitions\": 1,$", MR_Next
},
203 {"\"repetition_index\": 0,$", MR_Next
},
204 {"\"threads\": 1,$", MR_Next
},
205 {"\"iterations\": %int,$", MR_Next
},
206 {"\"real_time\": %float,$", MR_Next
},
207 {"\"cpu_time\": %float,$", MR_Next
},
208 {"\"time_unit\": \"ns\"$", MR_Next
},
210 ADD_CASES(TC_CSVOut
, {{"^\"BM_time_label_nanosecond\",%csv_report$"}});
212 void BM_time_label_microsecond(benchmark::State
& state
) {
213 for (auto _
: state
) {
216 BENCHMARK(BM_time_label_microsecond
)->Unit(benchmark::kMicrosecond
);
218 ADD_CASES(TC_ConsoleOut
, {{"^BM_time_label_microsecond %console_us_report$"}});
219 ADD_CASES(TC_JSONOut
,
220 {{"\"name\": \"BM_time_label_microsecond\",$"},
221 {"\"family_index\": 5,$", MR_Next
},
222 {"\"per_family_instance_index\": 0,$", MR_Next
},
223 {"\"run_name\": \"BM_time_label_microsecond\",$", MR_Next
},
224 {"\"run_type\": \"iteration\",$", MR_Next
},
225 {"\"repetitions\": 1,$", MR_Next
},
226 {"\"repetition_index\": 0,$", MR_Next
},
227 {"\"threads\": 1,$", MR_Next
},
228 {"\"iterations\": %int,$", MR_Next
},
229 {"\"real_time\": %float,$", MR_Next
},
230 {"\"cpu_time\": %float,$", MR_Next
},
231 {"\"time_unit\": \"us\"$", MR_Next
},
233 ADD_CASES(TC_CSVOut
, {{"^\"BM_time_label_microsecond\",%csv_us_report$"}});
235 void BM_time_label_millisecond(benchmark::State
& state
) {
236 for (auto _
: state
) {
239 BENCHMARK(BM_time_label_millisecond
)->Unit(benchmark::kMillisecond
);
241 ADD_CASES(TC_ConsoleOut
, {{"^BM_time_label_millisecond %console_ms_report$"}});
242 ADD_CASES(TC_JSONOut
,
243 {{"\"name\": \"BM_time_label_millisecond\",$"},
244 {"\"family_index\": 6,$", MR_Next
},
245 {"\"per_family_instance_index\": 0,$", MR_Next
},
246 {"\"run_name\": \"BM_time_label_millisecond\",$", MR_Next
},
247 {"\"run_type\": \"iteration\",$", MR_Next
},
248 {"\"repetitions\": 1,$", MR_Next
},
249 {"\"repetition_index\": 0,$", MR_Next
},
250 {"\"threads\": 1,$", MR_Next
},
251 {"\"iterations\": %int,$", MR_Next
},
252 {"\"real_time\": %float,$", MR_Next
},
253 {"\"cpu_time\": %float,$", MR_Next
},
254 {"\"time_unit\": \"ms\"$", MR_Next
},
256 ADD_CASES(TC_CSVOut
, {{"^\"BM_time_label_millisecond\",%csv_ms_report$"}});
258 void BM_time_label_second(benchmark::State
& state
) {
259 for (auto _
: state
) {
262 BENCHMARK(BM_time_label_second
)->Unit(benchmark::kSecond
);
264 ADD_CASES(TC_ConsoleOut
, {{"^BM_time_label_second %console_s_report$"}});
265 ADD_CASES(TC_JSONOut
, {{"\"name\": \"BM_time_label_second\",$"},
266 {"\"family_index\": 7,$", MR_Next
},
267 {"\"per_family_instance_index\": 0,$", MR_Next
},
268 {"\"run_name\": \"BM_time_label_second\",$", MR_Next
},
269 {"\"run_type\": \"iteration\",$", MR_Next
},
270 {"\"repetitions\": 1,$", MR_Next
},
271 {"\"repetition_index\": 0,$", MR_Next
},
272 {"\"threads\": 1,$", MR_Next
},
273 {"\"iterations\": %int,$", MR_Next
},
274 {"\"real_time\": %float,$", MR_Next
},
275 {"\"cpu_time\": %float,$", MR_Next
},
276 {"\"time_unit\": \"s\"$", MR_Next
},
278 ADD_CASES(TC_CSVOut
, {{"^\"BM_time_label_second\",%csv_s_report$"}});
280 // ========================================================================= //
281 // ------------------------ Testing Error Output --------------------------- //
282 // ========================================================================= //
284 void BM_error(benchmark::State
& state
) {
285 state
.SkipWithError("message");
286 for (auto _
: state
) {
290 ADD_CASES(TC_ConsoleOut
, {{"^BM_error[ ]+ERROR OCCURRED: 'message'$"}});
291 ADD_CASES(TC_JSONOut
, {{"\"name\": \"BM_error\",$"},
292 {"\"family_index\": 8,$", MR_Next
},
293 {"\"per_family_instance_index\": 0,$", MR_Next
},
294 {"\"run_name\": \"BM_error\",$", MR_Next
},
295 {"\"run_type\": \"iteration\",$", MR_Next
},
296 {"\"repetitions\": 1,$", MR_Next
},
297 {"\"repetition_index\": 0,$", MR_Next
},
298 {"\"threads\": 1,$", MR_Next
},
299 {"\"error_occurred\": true,$", MR_Next
},
300 {"\"error_message\": \"message\",$", MR_Next
}});
302 ADD_CASES(TC_CSVOut
, {{"^\"BM_error\",,,,,,,,true,\"message\"$"}});
304 // ========================================================================= //
305 // ------------------------ Testing No Arg Name Output -----------------------
307 // ========================================================================= //
309 void BM_no_arg_name(benchmark::State
& state
) {
310 for (auto _
: state
) {
313 BENCHMARK(BM_no_arg_name
)->Arg(3);
314 ADD_CASES(TC_ConsoleOut
, {{"^BM_no_arg_name/3 %console_report$"}});
315 ADD_CASES(TC_JSONOut
, {{"\"name\": \"BM_no_arg_name/3\",$"},
316 {"\"family_index\": 9,$", MR_Next
},
317 {"\"per_family_instance_index\": 0,$", MR_Next
},
318 {"\"run_name\": \"BM_no_arg_name/3\",$", MR_Next
},
319 {"\"run_type\": \"iteration\",$", MR_Next
},
320 {"\"repetitions\": 1,$", MR_Next
},
321 {"\"repetition_index\": 0,$", MR_Next
},
322 {"\"threads\": 1,$", MR_Next
}});
323 ADD_CASES(TC_CSVOut
, {{"^\"BM_no_arg_name/3\",%csv_report$"}});
325 // ========================================================================= //
326 // ------------------------ Testing Arg Name Output ------------------------ //
327 // ========================================================================= //
329 void BM_arg_name(benchmark::State
& state
) {
330 for (auto _
: state
) {
333 BENCHMARK(BM_arg_name
)->ArgName("first")->Arg(3);
334 ADD_CASES(TC_ConsoleOut
, {{"^BM_arg_name/first:3 %console_report$"}});
335 ADD_CASES(TC_JSONOut
, {{"\"name\": \"BM_arg_name/first:3\",$"},
336 {"\"family_index\": 10,$", MR_Next
},
337 {"\"per_family_instance_index\": 0,$", MR_Next
},
338 {"\"run_name\": \"BM_arg_name/first:3\",$", MR_Next
},
339 {"\"run_type\": \"iteration\",$", MR_Next
},
340 {"\"repetitions\": 1,$", MR_Next
},
341 {"\"repetition_index\": 0,$", MR_Next
},
342 {"\"threads\": 1,$", MR_Next
}});
343 ADD_CASES(TC_CSVOut
, {{"^\"BM_arg_name/first:3\",%csv_report$"}});
345 // ========================================================================= //
346 // ------------------------ Testing Arg Names Output ----------------------- //
347 // ========================================================================= //
349 void BM_arg_names(benchmark::State
& state
) {
350 for (auto _
: state
) {
353 BENCHMARK(BM_arg_names
)->Args({2, 5, 4})->ArgNames({"first", "", "third"});
354 ADD_CASES(TC_ConsoleOut
,
355 {{"^BM_arg_names/first:2/5/third:4 %console_report$"}});
356 ADD_CASES(TC_JSONOut
,
357 {{"\"name\": \"BM_arg_names/first:2/5/third:4\",$"},
358 {"\"family_index\": 11,$", MR_Next
},
359 {"\"per_family_instance_index\": 0,$", MR_Next
},
360 {"\"run_name\": \"BM_arg_names/first:2/5/third:4\",$", MR_Next
},
361 {"\"run_type\": \"iteration\",$", MR_Next
},
362 {"\"repetitions\": 1,$", MR_Next
},
363 {"\"repetition_index\": 0,$", MR_Next
},
364 {"\"threads\": 1,$", MR_Next
}});
365 ADD_CASES(TC_CSVOut
, {{"^\"BM_arg_names/first:2/5/third:4\",%csv_report$"}});
367 // ========================================================================= //
368 // ------------------------ Testing Name Output ---------------------------- //
369 // ========================================================================= //
371 void BM_name(benchmark::State
& state
) {
372 for (auto _
: state
) {
375 BENCHMARK(BM_name
)->Name("BM_custom_name");
377 ADD_CASES(TC_ConsoleOut
, {{"^BM_custom_name %console_report$"}});
378 ADD_CASES(TC_JSONOut
, {{"\"name\": \"BM_custom_name\",$"},
379 {"\"family_index\": 12,$", MR_Next
},
380 {"\"per_family_instance_index\": 0,$", MR_Next
},
381 {"\"run_name\": \"BM_custom_name\",$", MR_Next
},
382 {"\"run_type\": \"iteration\",$", MR_Next
},
383 {"\"repetitions\": 1,$", MR_Next
},
384 {"\"repetition_index\": 0,$", MR_Next
},
385 {"\"threads\": 1,$", MR_Next
},
386 {"\"iterations\": %int,$", MR_Next
},
387 {"\"real_time\": %float,$", MR_Next
},
388 {"\"cpu_time\": %float,$", MR_Next
},
389 {"\"time_unit\": \"ns\"$", MR_Next
},
391 ADD_CASES(TC_CSVOut
, {{"^\"BM_custom_name\",%csv_report$"}});
393 // ========================================================================= //
394 // ------------------------ Testing Big Args Output ------------------------ //
395 // ========================================================================= //
397 void BM_BigArgs(benchmark::State
& state
) {
398 for (auto _
: state
) {
401 BENCHMARK(BM_BigArgs
)->RangeMultiplier(2)->Range(1U << 30U, 1U << 31U);
402 ADD_CASES(TC_ConsoleOut
, {{"^BM_BigArgs/1073741824 %console_report$"},
403 {"^BM_BigArgs/2147483648 %console_report$"}});
405 // ========================================================================= //
406 // ----------------------- Testing Complexity Output ----------------------- //
407 // ========================================================================= //
409 void BM_Complexity_O1(benchmark::State
& state
) {
410 for (auto _
: state
) {
411 // This test requires a non-zero CPU time to avoid divide-by-zero
412 auto iterations
= double(state
.iterations()) * double(state
.iterations());
413 benchmark::DoNotOptimize(iterations
);
415 state
.SetComplexityN(state
.range(0));
417 BENCHMARK(BM_Complexity_O1
)->Range(1, 1 << 18)->Complexity(benchmark::o1
);
418 SET_SUBSTITUTIONS({{"%bigOStr", "[ ]* %float \\([0-9]+\\)"},
419 {"%RMS", "[ ]*[0-9]+ %"}});
420 ADD_CASES(TC_ConsoleOut
, {{"^BM_Complexity_O1_BigO %bigOStr %bigOStr[ ]*$"},
421 {"^BM_Complexity_O1_RMS %RMS %RMS[ ]*$"}});
423 // ========================================================================= //
424 // ----------------------- Testing Aggregate Output ------------------------ //
425 // ========================================================================= //
427 // Test that non-aggregate data is printed by default
428 void BM_Repeat(benchmark::State
& state
) {
429 for (auto _
: state
) {
432 // need two repetitions min to be able to output any aggregate output
433 BENCHMARK(BM_Repeat
)->Repetitions(2);
434 ADD_CASES(TC_ConsoleOut
,
435 {{"^BM_Repeat/repeats:2 %console_report$"},
436 {"^BM_Repeat/repeats:2 %console_report$"},
437 {"^BM_Repeat/repeats:2_mean %console_time_only_report [ ]*2$"},
438 {"^BM_Repeat/repeats:2_median %console_time_only_report [ ]*2$"},
439 {"^BM_Repeat/repeats:2_stddev %console_time_only_report [ ]*2$"}});
440 ADD_CASES(TC_JSONOut
, {{"\"name\": \"BM_Repeat/repeats:2\",$"},
441 {"\"family_index\": 15,$", MR_Next
},
442 {"\"per_family_instance_index\": 0,$", MR_Next
},
443 {"\"run_name\": \"BM_Repeat/repeats:2\"", MR_Next
},
444 {"\"run_type\": \"iteration\",$", MR_Next
},
445 {"\"repetitions\": 2,$", MR_Next
},
446 {"\"repetition_index\": 0,$", MR_Next
},
447 {"\"threads\": 1,$", MR_Next
},
448 {"\"name\": \"BM_Repeat/repeats:2\",$"},
449 {"\"family_index\": 15,$", MR_Next
},
450 {"\"per_family_instance_index\": 0,$", MR_Next
},
451 {"\"run_name\": \"BM_Repeat/repeats:2\",$", MR_Next
},
452 {"\"run_type\": \"iteration\",$", MR_Next
},
453 {"\"repetitions\": 2,$", MR_Next
},
454 {"\"repetition_index\": 1,$", MR_Next
},
455 {"\"threads\": 1,$", MR_Next
},
456 {"\"name\": \"BM_Repeat/repeats:2_mean\",$"},
457 {"\"family_index\": 15,$", MR_Next
},
458 {"\"per_family_instance_index\": 0,$", MR_Next
},
459 {"\"run_name\": \"BM_Repeat/repeats:2\",$", MR_Next
},
460 {"\"run_type\": \"aggregate\",$", MR_Next
},
461 {"\"repetitions\": 2,$", MR_Next
},
462 {"\"threads\": 1,$", MR_Next
},
463 {"\"aggregate_name\": \"mean\",$", MR_Next
},
464 {"\"aggregate_unit\": \"time\",$", MR_Next
},
465 {"\"iterations\": 2,$", MR_Next
},
466 {"\"name\": \"BM_Repeat/repeats:2_median\",$"},
467 {"\"family_index\": 15,$", MR_Next
},
468 {"\"per_family_instance_index\": 0,$", MR_Next
},
469 {"\"run_name\": \"BM_Repeat/repeats:2\",$", MR_Next
},
470 {"\"run_type\": \"aggregate\",$", MR_Next
},
471 {"\"repetitions\": 2,$", MR_Next
},
472 {"\"threads\": 1,$", MR_Next
},
473 {"\"aggregate_name\": \"median\",$", MR_Next
},
474 {"\"aggregate_unit\": \"time\",$", MR_Next
},
475 {"\"iterations\": 2,$", MR_Next
},
476 {"\"name\": \"BM_Repeat/repeats:2_stddev\",$"},
477 {"\"family_index\": 15,$", MR_Next
},
478 {"\"per_family_instance_index\": 0,$", MR_Next
},
479 {"\"run_name\": \"BM_Repeat/repeats:2\",$", MR_Next
},
480 {"\"run_type\": \"aggregate\",$", MR_Next
},
481 {"\"repetitions\": 2,$", MR_Next
},
482 {"\"threads\": 1,$", MR_Next
},
483 {"\"aggregate_name\": \"stddev\",$", MR_Next
},
484 {"\"aggregate_unit\": \"time\",$", MR_Next
},
485 {"\"iterations\": 2,$", MR_Next
}});
486 ADD_CASES(TC_CSVOut
, {{"^\"BM_Repeat/repeats:2\",%csv_report$"},
487 {"^\"BM_Repeat/repeats:2\",%csv_report$"},
488 {"^\"BM_Repeat/repeats:2_mean\",%csv_report$"},
489 {"^\"BM_Repeat/repeats:2_median\",%csv_report$"},
490 {"^\"BM_Repeat/repeats:2_stddev\",%csv_report$"}});
491 // but for two repetitions, mean and median is the same, so let's repeat..
492 BENCHMARK(BM_Repeat
)->Repetitions(3);
493 ADD_CASES(TC_ConsoleOut
,
494 {{"^BM_Repeat/repeats:3 %console_report$"},
495 {"^BM_Repeat/repeats:3 %console_report$"},
496 {"^BM_Repeat/repeats:3 %console_report$"},
497 {"^BM_Repeat/repeats:3_mean %console_time_only_report [ ]*3$"},
498 {"^BM_Repeat/repeats:3_median %console_time_only_report [ ]*3$"},
499 {"^BM_Repeat/repeats:3_stddev %console_time_only_report [ ]*3$"}});
500 ADD_CASES(TC_JSONOut
, {{"\"name\": \"BM_Repeat/repeats:3\",$"},
501 {"\"family_index\": 16,$", MR_Next
},
502 {"\"per_family_instance_index\": 0,$", MR_Next
},
503 {"\"run_name\": \"BM_Repeat/repeats:3\",$", MR_Next
},
504 {"\"run_type\": \"iteration\",$", MR_Next
},
505 {"\"repetitions\": 3,$", MR_Next
},
506 {"\"repetition_index\": 0,$", MR_Next
},
507 {"\"threads\": 1,$", MR_Next
},
508 {"\"name\": \"BM_Repeat/repeats:3\",$"},
509 {"\"family_index\": 16,$", MR_Next
},
510 {"\"per_family_instance_index\": 0,$", MR_Next
},
511 {"\"run_name\": \"BM_Repeat/repeats:3\",$", MR_Next
},
512 {"\"run_type\": \"iteration\",$", MR_Next
},
513 {"\"repetitions\": 3,$", MR_Next
},
514 {"\"repetition_index\": 1,$", MR_Next
},
515 {"\"threads\": 1,$", MR_Next
},
516 {"\"name\": \"BM_Repeat/repeats:3\",$"},
517 {"\"family_index\": 16,$", MR_Next
},
518 {"\"per_family_instance_index\": 0,$", MR_Next
},
519 {"\"run_name\": \"BM_Repeat/repeats:3\",$", MR_Next
},
520 {"\"run_type\": \"iteration\",$", MR_Next
},
521 {"\"repetitions\": 3,$", MR_Next
},
522 {"\"repetition_index\": 2,$", MR_Next
},
523 {"\"threads\": 1,$", MR_Next
},
524 {"\"name\": \"BM_Repeat/repeats:3_mean\",$"},
525 {"\"family_index\": 16,$", MR_Next
},
526 {"\"per_family_instance_index\": 0,$", MR_Next
},
527 {"\"run_name\": \"BM_Repeat/repeats:3\",$", MR_Next
},
528 {"\"run_type\": \"aggregate\",$", MR_Next
},
529 {"\"repetitions\": 3,$", MR_Next
},
530 {"\"threads\": 1,$", MR_Next
},
531 {"\"aggregate_name\": \"mean\",$", MR_Next
},
532 {"\"aggregate_unit\": \"time\",$", MR_Next
},
533 {"\"iterations\": 3,$", MR_Next
},
534 {"\"name\": \"BM_Repeat/repeats:3_median\",$"},
535 {"\"family_index\": 16,$", MR_Next
},
536 {"\"per_family_instance_index\": 0,$", MR_Next
},
537 {"\"run_name\": \"BM_Repeat/repeats:3\",$", MR_Next
},
538 {"\"run_type\": \"aggregate\",$", MR_Next
},
539 {"\"repetitions\": 3,$", MR_Next
},
540 {"\"threads\": 1,$", MR_Next
},
541 {"\"aggregate_name\": \"median\",$", MR_Next
},
542 {"\"aggregate_unit\": \"time\",$", MR_Next
},
543 {"\"iterations\": 3,$", MR_Next
},
544 {"\"name\": \"BM_Repeat/repeats:3_stddev\",$"},
545 {"\"family_index\": 16,$", MR_Next
},
546 {"\"per_family_instance_index\": 0,$", MR_Next
},
547 {"\"run_name\": \"BM_Repeat/repeats:3\",$", MR_Next
},
548 {"\"run_type\": \"aggregate\",$", MR_Next
},
549 {"\"repetitions\": 3,$", MR_Next
},
550 {"\"threads\": 1,$", MR_Next
},
551 {"\"aggregate_name\": \"stddev\",$", MR_Next
},
552 {"\"aggregate_unit\": \"time\",$", MR_Next
},
553 {"\"iterations\": 3,$", MR_Next
}});
554 ADD_CASES(TC_CSVOut
, {{"^\"BM_Repeat/repeats:3\",%csv_report$"},
555 {"^\"BM_Repeat/repeats:3\",%csv_report$"},
556 {"^\"BM_Repeat/repeats:3\",%csv_report$"},
557 {"^\"BM_Repeat/repeats:3_mean\",%csv_report$"},
558 {"^\"BM_Repeat/repeats:3_median\",%csv_report$"},
559 {"^\"BM_Repeat/repeats:3_stddev\",%csv_report$"}});
560 // median differs between even/odd number of repetitions, so just to be sure
561 BENCHMARK(BM_Repeat
)->Repetitions(4);
562 ADD_CASES(TC_ConsoleOut
,
563 {{"^BM_Repeat/repeats:4 %console_report$"},
564 {"^BM_Repeat/repeats:4 %console_report$"},
565 {"^BM_Repeat/repeats:4 %console_report$"},
566 {"^BM_Repeat/repeats:4 %console_report$"},
567 {"^BM_Repeat/repeats:4_mean %console_time_only_report [ ]*4$"},
568 {"^BM_Repeat/repeats:4_median %console_time_only_report [ ]*4$"},
569 {"^BM_Repeat/repeats:4_stddev %console_time_only_report [ ]*4$"}});
570 ADD_CASES(TC_JSONOut
, {{"\"name\": \"BM_Repeat/repeats:4\",$"},
571 {"\"family_index\": 17,$", MR_Next
},
572 {"\"per_family_instance_index\": 0,$", MR_Next
},
573 {"\"run_name\": \"BM_Repeat/repeats:4\",$", MR_Next
},
574 {"\"run_type\": \"iteration\",$", MR_Next
},
575 {"\"repetitions\": 4,$", MR_Next
},
576 {"\"repetition_index\": 0,$", MR_Next
},
577 {"\"threads\": 1,$", MR_Next
},
578 {"\"name\": \"BM_Repeat/repeats:4\",$"},
579 {"\"family_index\": 17,$", MR_Next
},
580 {"\"per_family_instance_index\": 0,$", MR_Next
},
581 {"\"run_name\": \"BM_Repeat/repeats:4\",$", MR_Next
},
582 {"\"run_type\": \"iteration\",$", MR_Next
},
583 {"\"repetitions\": 4,$", MR_Next
},
584 {"\"repetition_index\": 1,$", MR_Next
},
585 {"\"threads\": 1,$", MR_Next
},
586 {"\"name\": \"BM_Repeat/repeats:4\",$"},
587 {"\"family_index\": 17,$", MR_Next
},
588 {"\"per_family_instance_index\": 0,$", MR_Next
},
589 {"\"run_name\": \"BM_Repeat/repeats:4\",$", MR_Next
},
590 {"\"run_type\": \"iteration\",$", MR_Next
},
591 {"\"repetitions\": 4,$", MR_Next
},
592 {"\"repetition_index\": 2,$", MR_Next
},
593 {"\"threads\": 1,$", MR_Next
},
594 {"\"name\": \"BM_Repeat/repeats:4\",$"},
595 {"\"family_index\": 17,$", MR_Next
},
596 {"\"per_family_instance_index\": 0,$", MR_Next
},
597 {"\"run_name\": \"BM_Repeat/repeats:4\",$", MR_Next
},
598 {"\"run_type\": \"iteration\",$", MR_Next
},
599 {"\"repetitions\": 4,$", MR_Next
},
600 {"\"repetition_index\": 3,$", MR_Next
},
601 {"\"threads\": 1,$", MR_Next
},
602 {"\"name\": \"BM_Repeat/repeats:4_mean\",$"},
603 {"\"family_index\": 17,$", MR_Next
},
604 {"\"per_family_instance_index\": 0,$", MR_Next
},
605 {"\"run_name\": \"BM_Repeat/repeats:4\",$", MR_Next
},
606 {"\"run_type\": \"aggregate\",$", MR_Next
},
607 {"\"repetitions\": 4,$", MR_Next
},
608 {"\"threads\": 1,$", MR_Next
},
609 {"\"aggregate_name\": \"mean\",$", MR_Next
},
610 {"\"aggregate_unit\": \"time\",$", MR_Next
},
611 {"\"iterations\": 4,$", MR_Next
},
612 {"\"name\": \"BM_Repeat/repeats:4_median\",$"},
613 {"\"family_index\": 17,$", MR_Next
},
614 {"\"per_family_instance_index\": 0,$", MR_Next
},
615 {"\"run_name\": \"BM_Repeat/repeats:4\",$", MR_Next
},
616 {"\"run_type\": \"aggregate\",$", MR_Next
},
617 {"\"repetitions\": 4,$", MR_Next
},
618 {"\"threads\": 1,$", MR_Next
},
619 {"\"aggregate_name\": \"median\",$", MR_Next
},
620 {"\"aggregate_unit\": \"time\",$", MR_Next
},
621 {"\"iterations\": 4,$", MR_Next
},
622 {"\"name\": \"BM_Repeat/repeats:4_stddev\",$"},
623 {"\"family_index\": 17,$", MR_Next
},
624 {"\"per_family_instance_index\": 0,$", MR_Next
},
625 {"\"run_name\": \"BM_Repeat/repeats:4\",$", MR_Next
},
626 {"\"run_type\": \"aggregate\",$", MR_Next
},
627 {"\"repetitions\": 4,$", MR_Next
},
628 {"\"threads\": 1,$", MR_Next
},
629 {"\"aggregate_name\": \"stddev\",$", MR_Next
},
630 {"\"aggregate_unit\": \"time\",$", MR_Next
},
631 {"\"iterations\": 4,$", MR_Next
}});
632 ADD_CASES(TC_CSVOut
, {{"^\"BM_Repeat/repeats:4\",%csv_report$"},
633 {"^\"BM_Repeat/repeats:4\",%csv_report$"},
634 {"^\"BM_Repeat/repeats:4\",%csv_report$"},
635 {"^\"BM_Repeat/repeats:4\",%csv_report$"},
636 {"^\"BM_Repeat/repeats:4_mean\",%csv_report$"},
637 {"^\"BM_Repeat/repeats:4_median\",%csv_report$"},
638 {"^\"BM_Repeat/repeats:4_stddev\",%csv_report$"}});
640 // Test that a non-repeated test still prints non-aggregate results even when
641 // only-aggregate reports have been requested
642 void BM_RepeatOnce(benchmark::State
& state
) {
643 for (auto _
: state
) {
646 BENCHMARK(BM_RepeatOnce
)->Repetitions(1)->ReportAggregatesOnly();
647 ADD_CASES(TC_ConsoleOut
, {{"^BM_RepeatOnce/repeats:1 %console_report$"}});
648 ADD_CASES(TC_JSONOut
, {{"\"name\": \"BM_RepeatOnce/repeats:1\",$"},
649 {"\"family_index\": 18,$", MR_Next
},
650 {"\"per_family_instance_index\": 0,$", MR_Next
},
651 {"\"run_name\": \"BM_RepeatOnce/repeats:1\",$", MR_Next
},
652 {"\"run_type\": \"iteration\",$", MR_Next
},
653 {"\"repetitions\": 1,$", MR_Next
},
654 {"\"repetition_index\": 0,$", MR_Next
},
655 {"\"threads\": 1,$", MR_Next
}});
656 ADD_CASES(TC_CSVOut
, {{"^\"BM_RepeatOnce/repeats:1\",%csv_report$"}});
658 // Test that non-aggregate data is not reported
659 void BM_SummaryRepeat(benchmark::State
& state
) {
660 for (auto _
: state
) {
663 BENCHMARK(BM_SummaryRepeat
)->Repetitions(3)->ReportAggregatesOnly();
666 {{".*BM_SummaryRepeat/repeats:3 ", MR_Not
},
667 {"^BM_SummaryRepeat/repeats:3_mean %console_time_only_report [ ]*3$"},
668 {"^BM_SummaryRepeat/repeats:3_median %console_time_only_report [ ]*3$"},
669 {"^BM_SummaryRepeat/repeats:3_stddev %console_time_only_report [ ]*3$"}});
670 ADD_CASES(TC_JSONOut
,
671 {{".*BM_SummaryRepeat/repeats:3 ", MR_Not
},
672 {"\"name\": \"BM_SummaryRepeat/repeats:3_mean\",$"},
673 {"\"family_index\": 19,$", MR_Next
},
674 {"\"per_family_instance_index\": 0,$", MR_Next
},
675 {"\"run_name\": \"BM_SummaryRepeat/repeats:3\",$", MR_Next
},
676 {"\"run_type\": \"aggregate\",$", MR_Next
},
677 {"\"repetitions\": 3,$", MR_Next
},
678 {"\"threads\": 1,$", MR_Next
},
679 {"\"aggregate_name\": \"mean\",$", MR_Next
},
680 {"\"aggregate_unit\": \"time\",$", MR_Next
},
681 {"\"iterations\": 3,$", MR_Next
},
682 {"\"name\": \"BM_SummaryRepeat/repeats:3_median\",$"},
683 {"\"family_index\": 19,$", MR_Next
},
684 {"\"per_family_instance_index\": 0,$", MR_Next
},
685 {"\"run_name\": \"BM_SummaryRepeat/repeats:3\",$", MR_Next
},
686 {"\"run_type\": \"aggregate\",$", MR_Next
},
687 {"\"repetitions\": 3,$", MR_Next
},
688 {"\"threads\": 1,$", MR_Next
},
689 {"\"aggregate_name\": \"median\",$", MR_Next
},
690 {"\"aggregate_unit\": \"time\",$", MR_Next
},
691 {"\"iterations\": 3,$", MR_Next
},
692 {"\"name\": \"BM_SummaryRepeat/repeats:3_stddev\",$"},
693 {"\"family_index\": 19,$", MR_Next
},
694 {"\"per_family_instance_index\": 0,$", MR_Next
},
695 {"\"run_name\": \"BM_SummaryRepeat/repeats:3\",$", MR_Next
},
696 {"\"run_type\": \"aggregate\",$", MR_Next
},
697 {"\"repetitions\": 3,$", MR_Next
},
698 {"\"threads\": 1,$", MR_Next
},
699 {"\"aggregate_name\": \"stddev\",$", MR_Next
},
700 {"\"aggregate_unit\": \"time\",$", MR_Next
},
701 {"\"iterations\": 3,$", MR_Next
}});
702 ADD_CASES(TC_CSVOut
, {{".*BM_SummaryRepeat/repeats:3 ", MR_Not
},
703 {"^\"BM_SummaryRepeat/repeats:3_mean\",%csv_report$"},
704 {"^\"BM_SummaryRepeat/repeats:3_median\",%csv_report$"},
705 {"^\"BM_SummaryRepeat/repeats:3_stddev\",%csv_report$"}});
707 // Test that non-aggregate data is not displayed.
708 // NOTE: this test is kinda bad. we are only testing the display output.
709 // But we don't check that the file output still contains everything...
710 void BM_SummaryDisplay(benchmark::State
& state
) {
711 for (auto _
: state
) {
714 BENCHMARK(BM_SummaryDisplay
)->Repetitions(2)->DisplayAggregatesOnly();
717 {{".*BM_SummaryDisplay/repeats:2 ", MR_Not
},
718 {"^BM_SummaryDisplay/repeats:2_mean %console_time_only_report [ ]*2$"},
719 {"^BM_SummaryDisplay/repeats:2_median %console_time_only_report [ ]*2$"},
720 {"^BM_SummaryDisplay/repeats:2_stddev %console_time_only_report [ ]*2$"}});
721 ADD_CASES(TC_JSONOut
,
722 {{".*BM_SummaryDisplay/repeats:2 ", MR_Not
},
723 {"\"name\": \"BM_SummaryDisplay/repeats:2_mean\",$"},
724 {"\"family_index\": 20,$", MR_Next
},
725 {"\"per_family_instance_index\": 0,$", MR_Next
},
726 {"\"run_name\": \"BM_SummaryDisplay/repeats:2\",$", MR_Next
},
727 {"\"run_type\": \"aggregate\",$", MR_Next
},
728 {"\"repetitions\": 2,$", MR_Next
},
729 {"\"threads\": 1,$", MR_Next
},
730 {"\"aggregate_name\": \"mean\",$", MR_Next
},
731 {"\"aggregate_unit\": \"time\",$", MR_Next
},
732 {"\"iterations\": 2,$", MR_Next
},
733 {"\"name\": \"BM_SummaryDisplay/repeats:2_median\",$"},
734 {"\"family_index\": 20,$", MR_Next
},
735 {"\"per_family_instance_index\": 0,$", MR_Next
},
736 {"\"run_name\": \"BM_SummaryDisplay/repeats:2\",$", MR_Next
},
737 {"\"run_type\": \"aggregate\",$", MR_Next
},
738 {"\"repetitions\": 2,$", MR_Next
},
739 {"\"threads\": 1,$", MR_Next
},
740 {"\"aggregate_name\": \"median\",$", MR_Next
},
741 {"\"aggregate_unit\": \"time\",$", MR_Next
},
742 {"\"iterations\": 2,$", MR_Next
},
743 {"\"name\": \"BM_SummaryDisplay/repeats:2_stddev\",$"},
744 {"\"family_index\": 20,$", MR_Next
},
745 {"\"per_family_instance_index\": 0,$", MR_Next
},
746 {"\"run_name\": \"BM_SummaryDisplay/repeats:2\",$", MR_Next
},
747 {"\"run_type\": \"aggregate\",$", MR_Next
},
748 {"\"repetitions\": 2,$", MR_Next
},
749 {"\"threads\": 1,$", MR_Next
},
750 {"\"aggregate_name\": \"stddev\",$", MR_Next
},
751 {"\"aggregate_unit\": \"time\",$", MR_Next
},
752 {"\"iterations\": 2,$", MR_Next
}});
754 {{".*BM_SummaryDisplay/repeats:2 ", MR_Not
},
755 {"^\"BM_SummaryDisplay/repeats:2_mean\",%csv_report$"},
756 {"^\"BM_SummaryDisplay/repeats:2_median\",%csv_report$"},
757 {"^\"BM_SummaryDisplay/repeats:2_stddev\",%csv_report$"}});
759 // Test repeats with custom time unit.
760 void BM_RepeatTimeUnit(benchmark::State
& state
) {
761 for (auto _
: state
) {
764 BENCHMARK(BM_RepeatTimeUnit
)
766 ->ReportAggregatesOnly()
767 ->Unit(benchmark::kMicrosecond
);
770 {{".*BM_RepeatTimeUnit/repeats:3 ", MR_Not
},
771 {"^BM_RepeatTimeUnit/repeats:3_mean %console_us_time_only_report [ ]*3$"},
772 {"^BM_RepeatTimeUnit/repeats:3_median %console_us_time_only_report [ "
774 {"^BM_RepeatTimeUnit/repeats:3_stddev %console_us_time_only_report [ "
776 ADD_CASES(TC_JSONOut
,
777 {{".*BM_RepeatTimeUnit/repeats:3 ", MR_Not
},
778 {"\"name\": \"BM_RepeatTimeUnit/repeats:3_mean\",$"},
779 {"\"family_index\": 21,$", MR_Next
},
780 {"\"per_family_instance_index\": 0,$", MR_Next
},
781 {"\"run_name\": \"BM_RepeatTimeUnit/repeats:3\",$", MR_Next
},
782 {"\"run_type\": \"aggregate\",$", MR_Next
},
783 {"\"repetitions\": 3,$", MR_Next
},
784 {"\"threads\": 1,$", MR_Next
},
785 {"\"aggregate_name\": \"mean\",$", MR_Next
},
786 {"\"aggregate_unit\": \"time\",$", MR_Next
},
787 {"\"iterations\": 3,$", MR_Next
},
788 {"\"time_unit\": \"us\",?$"},
789 {"\"name\": \"BM_RepeatTimeUnit/repeats:3_median\",$"},
790 {"\"family_index\": 21,$", MR_Next
},
791 {"\"per_family_instance_index\": 0,$", MR_Next
},
792 {"\"run_name\": \"BM_RepeatTimeUnit/repeats:3\",$", MR_Next
},
793 {"\"run_type\": \"aggregate\",$", MR_Next
},
794 {"\"repetitions\": 3,$", MR_Next
},
795 {"\"threads\": 1,$", MR_Next
},
796 {"\"aggregate_name\": \"median\",$", MR_Next
},
797 {"\"aggregate_unit\": \"time\",$", MR_Next
},
798 {"\"iterations\": 3,$", MR_Next
},
799 {"\"time_unit\": \"us\",?$"},
800 {"\"name\": \"BM_RepeatTimeUnit/repeats:3_stddev\",$"},
801 {"\"family_index\": 21,$", MR_Next
},
802 {"\"per_family_instance_index\": 0,$", MR_Next
},
803 {"\"run_name\": \"BM_RepeatTimeUnit/repeats:3\",$", MR_Next
},
804 {"\"run_type\": \"aggregate\",$", MR_Next
},
805 {"\"repetitions\": 3,$", MR_Next
},
806 {"\"threads\": 1,$", MR_Next
},
807 {"\"aggregate_name\": \"stddev\",$", MR_Next
},
808 {"\"aggregate_unit\": \"time\",$", MR_Next
},
809 {"\"iterations\": 3,$", MR_Next
},
810 {"\"time_unit\": \"us\",?$"}});
812 {{".*BM_RepeatTimeUnit/repeats:3 ", MR_Not
},
813 {"^\"BM_RepeatTimeUnit/repeats:3_mean\",%csv_us_report$"},
814 {"^\"BM_RepeatTimeUnit/repeats:3_median\",%csv_us_report$"},
815 {"^\"BM_RepeatTimeUnit/repeats:3_stddev\",%csv_us_report$"}});
817 // ========================================================================= //
818 // -------------------- Testing user-provided statistics ------------------- //
819 // ========================================================================= //
821 const auto UserStatistics
= [](const std::vector
<double>& v
) {
824 void BM_UserStats(benchmark::State
& state
) {
825 for (auto _
: state
) {
826 state
.SetIterationTime(150 / 10e8
);
830 BENCHMARK(BM_UserStats
)
834 ->ComputeStatistics("", UserStatistics
);
837 // check that user-provided stats is calculated, and is after the default-ones
838 // empty string as name is intentional, it would sort before anything else
839 ADD_CASES(TC_ConsoleOut
, {{"^BM_UserStats/iterations:5/repeats:3/manual_time [ "
840 "]* 150 ns %time [ ]*5$"},
841 {"^BM_UserStats/iterations:5/repeats:3/manual_time [ "
842 "]* 150 ns %time [ ]*5$"},
843 {"^BM_UserStats/iterations:5/repeats:3/manual_time [ "
844 "]* 150 ns %time [ ]*5$"},
845 {"^BM_UserStats/iterations:5/repeats:3/"
846 "manual_time_mean [ ]* 150 ns %time [ ]*3$"},
847 {"^BM_UserStats/iterations:5/repeats:3/"
848 "manual_time_median [ ]* 150 ns %time [ ]*3$"},
849 {"^BM_UserStats/iterations:5/repeats:3/"
850 "manual_time_stddev [ ]* 0.000 ns %time [ ]*3$"},
851 {"^BM_UserStats/iterations:5/repeats:3/manual_time_ "
852 "[ ]* 150 ns %time [ ]*3$"}});
855 {{"\"name\": \"BM_UserStats/iterations:5/repeats:3/manual_time\",$"},
856 {"\"family_index\": 22,$", MR_Next
},
857 {"\"per_family_instance_index\": 0,$", MR_Next
},
858 {"\"run_name\": \"BM_UserStats/iterations:5/repeats:3/manual_time\",$",
860 {"\"run_type\": \"iteration\",$", MR_Next
},
861 {"\"repetitions\": 3,$", MR_Next
},
862 {"\"repetition_index\": 0,$", MR_Next
},
863 {"\"threads\": 1,$", MR_Next
},
864 {"\"iterations\": 5,$", MR_Next
},
865 {"\"real_time\": 1\\.5(0)*e\\+(0)*2,$", MR_Next
},
866 {"\"name\": \"BM_UserStats/iterations:5/repeats:3/manual_time\",$"},
867 {"\"family_index\": 22,$", MR_Next
},
868 {"\"per_family_instance_index\": 0,$", MR_Next
},
869 {"\"run_name\": \"BM_UserStats/iterations:5/repeats:3/manual_time\",$",
871 {"\"run_type\": \"iteration\",$", MR_Next
},
872 {"\"repetitions\": 3,$", MR_Next
},
873 {"\"repetition_index\": 1,$", MR_Next
},
874 {"\"threads\": 1,$", MR_Next
},
875 {"\"iterations\": 5,$", MR_Next
},
876 {"\"real_time\": 1\\.5(0)*e\\+(0)*2,$", MR_Next
},
877 {"\"name\": \"BM_UserStats/iterations:5/repeats:3/manual_time\",$"},
878 {"\"family_index\": 22,$", MR_Next
},
879 {"\"per_family_instance_index\": 0,$", MR_Next
},
880 {"\"run_name\": \"BM_UserStats/iterations:5/repeats:3/manual_time\",$",
882 {"\"run_type\": \"iteration\",$", MR_Next
},
883 {"\"repetitions\": 3,$", MR_Next
},
884 {"\"repetition_index\": 2,$", MR_Next
},
885 {"\"threads\": 1,$", MR_Next
},
886 {"\"iterations\": 5,$", MR_Next
},
887 {"\"real_time\": 1\\.5(0)*e\\+(0)*2,$", MR_Next
},
888 {"\"name\": \"BM_UserStats/iterations:5/repeats:3/manual_time_mean\",$"},
889 {"\"family_index\": 22,$", MR_Next
},
890 {"\"per_family_instance_index\": 0,$", MR_Next
},
891 {"\"run_name\": \"BM_UserStats/iterations:5/repeats:3/manual_time\",$",
893 {"\"run_type\": \"aggregate\",$", MR_Next
},
894 {"\"repetitions\": 3,$", MR_Next
},
895 {"\"threads\": 1,$", MR_Next
},
896 {"\"aggregate_name\": \"mean\",$", MR_Next
},
897 {"\"aggregate_unit\": \"time\",$", MR_Next
},
898 {"\"iterations\": 3,$", MR_Next
},
899 {"\"real_time\": 1\\.5(0)*e\\+(0)*2,$", MR_Next
},
900 {"\"name\": \"BM_UserStats/iterations:5/repeats:3/manual_time_median\",$"},
901 {"\"family_index\": 22,$", MR_Next
},
902 {"\"per_family_instance_index\": 0,$", MR_Next
},
903 {"\"run_name\": \"BM_UserStats/iterations:5/repeats:3/manual_time\",$",
905 {"\"run_type\": \"aggregate\",$", MR_Next
},
906 {"\"repetitions\": 3,$", MR_Next
},
907 {"\"threads\": 1,$", MR_Next
},
908 {"\"aggregate_name\": \"median\",$", MR_Next
},
909 {"\"aggregate_unit\": \"time\",$", MR_Next
},
910 {"\"iterations\": 3,$", MR_Next
},
911 {"\"real_time\": 1\\.5(0)*e\\+(0)*2,$", MR_Next
},
912 {"\"name\": \"BM_UserStats/iterations:5/repeats:3/manual_time_stddev\",$"},
913 {"\"family_index\": 22,$", MR_Next
},
914 {"\"per_family_instance_index\": 0,$", MR_Next
},
915 {"\"run_name\": \"BM_UserStats/iterations:5/repeats:3/manual_time\",$",
917 {"\"run_type\": \"aggregate\",$", MR_Next
},
918 {"\"repetitions\": 3,$", MR_Next
},
919 {"\"threads\": 1,$", MR_Next
},
920 {"\"aggregate_name\": \"stddev\",$", MR_Next
},
921 {"\"aggregate_unit\": \"time\",$", MR_Next
},
922 {"\"iterations\": 3,$", MR_Next
},
923 {"\"real_time\": %float,$", MR_Next
},
924 {"\"name\": \"BM_UserStats/iterations:5/repeats:3/manual_time_\",$"},
925 {"\"family_index\": 22,$", MR_Next
},
926 {"\"per_family_instance_index\": 0,$", MR_Next
},
927 {"\"run_name\": \"BM_UserStats/iterations:5/repeats:3/manual_time\",$",
929 {"\"run_type\": \"aggregate\",$", MR_Next
},
930 {"\"repetitions\": 3,$", MR_Next
},
931 {"\"threads\": 1,$", MR_Next
},
932 {"\"aggregate_name\": \"\",$", MR_Next
},
933 {"\"aggregate_unit\": \"time\",$", MR_Next
},
934 {"\"iterations\": 3,$", MR_Next
},
935 {"\"real_time\": 1\\.5(0)*e\\+(0)*2,$", MR_Next
}});
938 {{"^\"BM_UserStats/iterations:5/repeats:3/manual_time\",%csv_report$"},
939 {"^\"BM_UserStats/iterations:5/repeats:3/manual_time\",%csv_report$"},
940 {"^\"BM_UserStats/iterations:5/repeats:3/manual_time\",%csv_report$"},
941 {"^\"BM_UserStats/iterations:5/repeats:3/manual_time_mean\",%csv_report$"},
942 {"^\"BM_UserStats/iterations:5/repeats:3/"
943 "manual_time_median\",%csv_report$"},
944 {"^\"BM_UserStats/iterations:5/repeats:3/"
945 "manual_time_stddev\",%csv_report$"},
946 {"^\"BM_UserStats/iterations:5/repeats:3/manual_time_\",%csv_report$"}});
948 // ========================================================================= //
949 // ------------- Testing relative standard deviation statistics ------------ //
950 // ========================================================================= //
952 const auto UserPercentStatistics
= [](const std::vector
<double>&) {
955 void BM_UserPercentStats(benchmark::State
& state
) {
956 for (auto _
: state
) {
957 state
.SetIterationTime(150 / 10e8
);
961 BENCHMARK(BM_UserPercentStats
)
965 ->Unit(benchmark::TimeUnit::kNanosecond
)
966 ->ComputeStatistics("", UserPercentStatistics
, benchmark::StatisticUnit::kPercentage
);
969 // check that UserPercent-provided stats is calculated, and is after the
970 // default-ones empty string as name is intentional, it would sort before
972 ADD_CASES(TC_ConsoleOut
,
973 {{"^BM_UserPercentStats/iterations:5/repeats:3/manual_time [ "
974 "]* 150 ns %time [ ]*5$"},
975 {"^BM_UserPercentStats/iterations:5/repeats:3/manual_time [ "
976 "]* 150 ns %time [ ]*5$"},
977 {"^BM_UserPercentStats/iterations:5/repeats:3/manual_time [ "
978 "]* 150 ns %time [ ]*5$"},
979 {"^BM_UserPercentStats/iterations:5/repeats:3/"
980 "manual_time_mean [ ]* 150 ns %time [ ]*3$"},
981 {"^BM_UserPercentStats/iterations:5/repeats:3/"
982 "manual_time_median [ ]* 150 ns %time [ ]*3$"},
983 {"^BM_UserPercentStats/iterations:5/repeats:3/"
984 "manual_time_stddev [ ]* 0.000 ns %time [ ]*3$"},
985 {"^BM_UserPercentStats/iterations:5/repeats:3/manual_time_ "
986 "[ ]* 1.00 % [ ]* 1.00 %[ ]*3$"}});
989 {{"\"name\": \"BM_UserPercentStats/iterations:5/repeats:3/manual_time\",$"},
990 {"\"family_index\": 23,$", MR_Next
},
991 {"\"per_family_instance_index\": 0,$", MR_Next
},
993 "\"BM_UserPercentStats/iterations:5/repeats:3/manual_time\",$",
995 {"\"run_type\": \"iteration\",$", MR_Next
},
996 {"\"repetitions\": 3,$", MR_Next
},
997 {"\"repetition_index\": 0,$", MR_Next
},
998 {"\"threads\": 1,$", MR_Next
},
999 {"\"iterations\": 5,$", MR_Next
},
1000 {"\"real_time\": 1\\.5(0)*e\\+(0)*2,$", MR_Next
},
1001 {"\"name\": \"BM_UserPercentStats/iterations:5/repeats:3/manual_time\",$"},
1002 {"\"family_index\": 23,$", MR_Next
},
1003 {"\"per_family_instance_index\": 0,$", MR_Next
},
1005 "\"BM_UserPercentStats/iterations:5/repeats:3/manual_time\",$",
1007 {"\"run_type\": \"iteration\",$", MR_Next
},
1008 {"\"repetitions\": 3,$", MR_Next
},
1009 {"\"repetition_index\": 1,$", MR_Next
},
1010 {"\"threads\": 1,$", MR_Next
},
1011 {"\"iterations\": 5,$", MR_Next
},
1012 {"\"real_time\": 1\\.5(0)*e\\+(0)*2,$", MR_Next
},
1013 {"\"name\": \"BM_UserPercentStats/iterations:5/repeats:3/manual_time\",$"},
1014 {"\"family_index\": 23,$", MR_Next
},
1015 {"\"per_family_instance_index\": 0,$", MR_Next
},
1017 "\"BM_UserPercentStats/iterations:5/repeats:3/manual_time\",$",
1019 {"\"run_type\": \"iteration\",$", MR_Next
},
1020 {"\"repetitions\": 3,$", MR_Next
},
1021 {"\"repetition_index\": 2,$", MR_Next
},
1022 {"\"threads\": 1,$", MR_Next
},
1023 {"\"iterations\": 5,$", MR_Next
},
1024 {"\"real_time\": 1\\.5(0)*e\\+(0)*2,$", MR_Next
},
1026 "\"BM_UserPercentStats/iterations:5/repeats:3/manual_time_mean\",$"},
1027 {"\"family_index\": 23,$", MR_Next
},
1028 {"\"per_family_instance_index\": 0,$", MR_Next
},
1030 "\"BM_UserPercentStats/iterations:5/repeats:3/manual_time\",$",
1032 {"\"run_type\": \"aggregate\",$", MR_Next
},
1033 {"\"repetitions\": 3,$", MR_Next
},
1034 {"\"threads\": 1,$", MR_Next
},
1035 {"\"aggregate_name\": \"mean\",$", MR_Next
},
1036 {"\"aggregate_unit\": \"time\",$", MR_Next
},
1037 {"\"iterations\": 3,$", MR_Next
},
1038 {"\"real_time\": 1\\.5(0)*e\\+(0)*2,$", MR_Next
},
1040 "\"BM_UserPercentStats/iterations:5/repeats:3/manual_time_median\",$"},
1041 {"\"family_index\": 23,$", MR_Next
},
1042 {"\"per_family_instance_index\": 0,$", MR_Next
},
1044 "\"BM_UserPercentStats/iterations:5/repeats:3/manual_time\",$",
1046 {"\"run_type\": \"aggregate\",$", MR_Next
},
1047 {"\"repetitions\": 3,$", MR_Next
},
1048 {"\"threads\": 1,$", MR_Next
},
1049 {"\"aggregate_name\": \"median\",$", MR_Next
},
1050 {"\"aggregate_unit\": \"time\",$", MR_Next
},
1051 {"\"iterations\": 3,$", MR_Next
},
1052 {"\"real_time\": 1\\.5(0)*e\\+(0)*2,$", MR_Next
},
1054 "\"BM_UserPercentStats/iterations:5/repeats:3/manual_time_stddev\",$"},
1055 {"\"family_index\": 23,$", MR_Next
},
1056 {"\"per_family_instance_index\": 0,$", MR_Next
},
1058 "\"BM_UserPercentStats/iterations:5/repeats:3/manual_time\",$",
1060 {"\"run_type\": \"aggregate\",$", MR_Next
},
1061 {"\"repetitions\": 3,$", MR_Next
},
1062 {"\"threads\": 1,$", MR_Next
},
1063 {"\"aggregate_name\": \"stddev\",$", MR_Next
},
1064 {"\"aggregate_unit\": \"time\",$", MR_Next
},
1065 {"\"iterations\": 3,$", MR_Next
},
1066 {"\"real_time\": %float,$", MR_Next
},
1068 "\"BM_UserPercentStats/iterations:5/repeats:3/manual_time_\",$"},
1069 {"\"family_index\": 23,$", MR_Next
},
1070 {"\"per_family_instance_index\": 0,$", MR_Next
},
1072 "\"BM_UserPercentStats/iterations:5/repeats:3/manual_time\",$",
1074 {"\"run_type\": \"aggregate\",$", MR_Next
},
1075 {"\"repetitions\": 3,$", MR_Next
},
1076 {"\"threads\": 1,$", MR_Next
},
1077 {"\"aggregate_name\": \"\",$", MR_Next
},
1078 {"\"aggregate_unit\": \"percentage\",$", MR_Next
},
1079 {"\"iterations\": 3,$", MR_Next
},
1080 {"\"real_time\": 1\\.(0)*e-(0)*2,$", MR_Next
}});
1081 ADD_CASES(TC_CSVOut
, {{"^\"BM_UserPercentStats/iterations:5/repeats:3/"
1082 "manual_time\",%csv_report$"},
1083 {"^\"BM_UserPercentStats/iterations:5/repeats:3/"
1084 "manual_time\",%csv_report$"},
1085 {"^\"BM_UserPercentStats/iterations:5/repeats:3/"
1086 "manual_time\",%csv_report$"},
1087 {"^\"BM_UserPercentStats/iterations:5/repeats:3/"
1088 "manual_time_mean\",%csv_report$"},
1089 {"^\"BM_UserPercentStats/iterations:5/repeats:3/"
1090 "manual_time_median\",%csv_report$"},
1091 {"^\"BM_UserPercentStats/iterations:5/repeats:3/"
1092 "manual_time_stddev\",%csv_report$"},
1093 {"^\"BM_UserPercentStats/iterations:5/repeats:3/"
1094 "manual_time_\",%csv_cv_report$"}});
1096 // ========================================================================= //
1097 // ------------------------- Testing StrEscape JSON ------------------------ //
1098 // ========================================================================= //
1099 #if 0 // enable when csv testing code correctly handles multi-line fields
1100 void BM_JSON_Format(benchmark::State
& state
) {
1101 state
.SkipWithError("val\b\f\n\r\t\\\"with\"es,capes");
1102 for (auto _
: state
) {
1105 BENCHMARK(BM_JSON_Format
);
1106 ADD_CASES(TC_JSONOut
, {{"\"name\": \"BM_JSON_Format\",$"},
1107 {"\"family_index\": 23,$", MR_Next
},
1108 {"\"per_family_instance_index\": 0,$", MR_Next
},
1109 {"\"run_name\": \"BM_JSON_Format\",$", MR_Next
},
1110 {"\"run_type\": \"iteration\",$", MR_Next
},
1111 {"\"repetitions\": 1,$", MR_Next
},
1112 {"\"repetition_index\": 0,$", MR_Next
},
1113 {"\"threads\": 1,$", MR_Next
},
1114 {"\"error_occurred\": true,$", MR_Next
},
1115 {R
"("error_message
": "val
\\b
\\f
\\n
\\r
\\t
\\\\\\"with\\"es
,capes
",$)", MR_Next
}});
1117 // ========================================================================= //
1118 // -------------------------- Testing CsvEscape ---------------------------- //
1119 // ========================================================================= //
1121 void BM_CSV_Format(benchmark::State
& state
) {
1122 state
.SkipWithError("\"freedom\"");
1123 for (auto _
: state
) {
1126 BENCHMARK(BM_CSV_Format
);
1127 ADD_CASES(TC_CSVOut
, {{"^\"BM_CSV_Format\",,,,,,,,true,\"\"\"freedom\"\"\"$"}});
1129 // ========================================================================= //
1130 // --------------------------- TEST CASES END ------------------------------ //
1131 // ========================================================================= //
1133 int main(int argc
, char* argv
[]) { RunOutputTests(argc
, argv
); }