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