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
, {
11 // keeping these lines long improves readability, so:
14 {"^Benchmark %s Time %s CPU %s Iterations %s Bar %s Bat %s Baz %s Foo %s Frob %s Lob$", MR_Next
},
16 {"^BM_Counters_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next
},
17 {"^BM_Counters_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next
},
18 {"^BM_Counters_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next
},
19 {"^BM_Counters_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next
},
20 {"^BM_Counters_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next
},
21 {"^BM_CounterRates_Tabular/threads:%int %console_report [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s$", MR_Next
},
22 {"^BM_CounterRates_Tabular/threads:%int %console_report [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s$", MR_Next
},
23 {"^BM_CounterRates_Tabular/threads:%int %console_report [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s$", MR_Next
},
24 {"^BM_CounterRates_Tabular/threads:%int %console_report [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s$", MR_Next
},
25 {"^BM_CounterRates_Tabular/threads:%int %console_report [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s$", MR_Next
},
27 {"^Benchmark %s Time %s CPU %s Iterations %s Bar %s Baz %s Foo$", MR_Next
},
29 {"^BM_CounterSet0_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next
},
30 {"^BM_CounterSet0_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next
},
31 {"^BM_CounterSet0_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next
},
32 {"^BM_CounterSet0_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next
},
33 {"^BM_CounterSet0_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next
},
34 {"^BM_CounterSet1_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next
},
35 {"^BM_CounterSet1_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next
},
36 {"^BM_CounterSet1_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next
},
37 {"^BM_CounterSet1_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next
},
38 {"^BM_CounterSet1_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next
},
40 {"^Benchmark %s Time %s CPU %s Iterations %s Bat %s Baz %s Foo$", MR_Next
},
42 {"^BM_CounterSet2_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next
},
43 {"^BM_CounterSet2_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next
},
44 {"^BM_CounterSet2_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next
},
45 {"^BM_CounterSet2_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next
},
46 {"^BM_CounterSet2_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$"},
49 ADD_CASES(TC_CSVOut
, {{"%csv_header,"
50 "\"Bar\",\"Bat\",\"Baz\",\"Foo\",\"Frob\",\"Lob\""}});
52 // ========================================================================= //
53 // ------------------------- Tabular Counters Output ----------------------- //
54 // ========================================================================= //
56 void BM_Counters_Tabular(benchmark::State
& state
) {
57 for (auto _
: state
) {
59 namespace bm
= benchmark
;
60 state
.counters
.insert({
61 {"Foo", { 1, bm::Counter::kAvgThreads
}},
62 {"Bar", { 2, bm::Counter::kAvgThreads
}},
63 {"Baz", { 4, bm::Counter::kAvgThreads
}},
64 {"Bat", { 8, bm::Counter::kAvgThreads
}},
65 {"Frob", {16, bm::Counter::kAvgThreads
}},
66 {"Lob", {32, bm::Counter::kAvgThreads
}},
69 BENCHMARK(BM_Counters_Tabular
)->ThreadRange(1, 16);
70 ADD_CASES(TC_JSONOut
, {{"\"name\": \"BM_Counters_Tabular/threads:%int\",$"},
71 {"\"iterations\": %int,$", MR_Next
},
72 {"\"real_time\": %float,$", MR_Next
},
73 {"\"cpu_time\": %float,$", MR_Next
},
74 {"\"time_unit\": \"ns\",$", MR_Next
},
75 {"\"Bar\": %float,$", MR_Next
},
76 {"\"Bat\": %float,$", MR_Next
},
77 {"\"Baz\": %float,$", MR_Next
},
78 {"\"Foo\": %float,$", MR_Next
},
79 {"\"Frob\": %float,$", MR_Next
},
80 {"\"Lob\": %float$", MR_Next
},
82 ADD_CASES(TC_CSVOut
, {{"^\"BM_Counters_Tabular/threads:%int\",%csv_report,"
83 "%float,%float,%float,%float,%float,%float$"}});
84 // VS2013 does not allow this function to be passed as a lambda argument
85 // to CHECK_BENCHMARK_RESULTS()
86 void CheckTabular(Results
const& e
) {
87 CHECK_COUNTER_VALUE(e
, int, "Foo", EQ
, 1);
88 CHECK_COUNTER_VALUE(e
, int, "Bar", EQ
, 2);
89 CHECK_COUNTER_VALUE(e
, int, "Baz", EQ
, 4);
90 CHECK_COUNTER_VALUE(e
, int, "Bat", EQ
, 8);
91 CHECK_COUNTER_VALUE(e
, int, "Frob", EQ
, 16);
92 CHECK_COUNTER_VALUE(e
, int, "Lob", EQ
, 32);
94 CHECK_BENCHMARK_RESULTS("BM_Counters_Tabular/threads:%int", &CheckTabular
);
96 // ========================================================================= //
97 // -------------------- Tabular+Rate Counters Output ----------------------- //
98 // ========================================================================= //
100 void BM_CounterRates_Tabular(benchmark::State
& state
) {
101 for (auto _
: state
) {
103 namespace bm
= benchmark
;
104 state
.counters
.insert({
105 {"Foo", { 1, bm::Counter::kAvgThreadsRate
}},
106 {"Bar", { 2, bm::Counter::kAvgThreadsRate
}},
107 {"Baz", { 4, bm::Counter::kAvgThreadsRate
}},
108 {"Bat", { 8, bm::Counter::kAvgThreadsRate
}},
109 {"Frob", {16, bm::Counter::kAvgThreadsRate
}},
110 {"Lob", {32, bm::Counter::kAvgThreadsRate
}},
113 BENCHMARK(BM_CounterRates_Tabular
)->ThreadRange(1, 16);
114 ADD_CASES(TC_JSONOut
, {{"\"name\": \"BM_CounterRates_Tabular/threads:%int\",$"},
115 {"\"iterations\": %int,$", MR_Next
},
116 {"\"real_time\": %float,$", MR_Next
},
117 {"\"cpu_time\": %float,$", MR_Next
},
118 {"\"time_unit\": \"ns\",$", MR_Next
},
119 {"\"Bar\": %float,$", MR_Next
},
120 {"\"Bat\": %float,$", MR_Next
},
121 {"\"Baz\": %float,$", MR_Next
},
122 {"\"Foo\": %float,$", MR_Next
},
123 {"\"Frob\": %float,$", MR_Next
},
124 {"\"Lob\": %float$", MR_Next
},
126 ADD_CASES(TC_CSVOut
, {{"^\"BM_CounterRates_Tabular/threads:%int\",%csv_report,"
127 "%float,%float,%float,%float,%float,%float$"}});
128 // VS2013 does not allow this function to be passed as a lambda argument
129 // to CHECK_BENCHMARK_RESULTS()
130 void CheckTabularRate(Results
const& e
) {
131 double t
= e
.DurationCPUTime();
132 CHECK_FLOAT_COUNTER_VALUE(e
, "Foo", EQ
, 1./t
, 0.001);
133 CHECK_FLOAT_COUNTER_VALUE(e
, "Bar", EQ
, 2./t
, 0.001);
134 CHECK_FLOAT_COUNTER_VALUE(e
, "Baz", EQ
, 4./t
, 0.001);
135 CHECK_FLOAT_COUNTER_VALUE(e
, "Bat", EQ
, 8./t
, 0.001);
136 CHECK_FLOAT_COUNTER_VALUE(e
, "Frob", EQ
, 16./t
, 0.001);
137 CHECK_FLOAT_COUNTER_VALUE(e
, "Lob", EQ
, 32./t
, 0.001);
139 CHECK_BENCHMARK_RESULTS("BM_CounterRates_Tabular/threads:%int",
142 // ========================================================================= //
143 // ------------------------- Tabular Counters Output ----------------------- //
144 // ========================================================================= //
146 // set only some of the counters
147 void BM_CounterSet0_Tabular(benchmark::State
& state
) {
148 for (auto _
: state
) {
150 namespace bm
= benchmark
;
151 state
.counters
.insert({
152 {"Foo", {10, bm::Counter::kAvgThreads
}},
153 {"Bar", {20, bm::Counter::kAvgThreads
}},
154 {"Baz", {40, bm::Counter::kAvgThreads
}},
157 BENCHMARK(BM_CounterSet0_Tabular
)->ThreadRange(1, 16);
158 ADD_CASES(TC_JSONOut
, {{"\"name\": \"BM_CounterSet0_Tabular/threads:%int\",$"},
159 {"\"iterations\": %int,$", MR_Next
},
160 {"\"real_time\": %float,$", MR_Next
},
161 {"\"cpu_time\": %float,$", MR_Next
},
162 {"\"time_unit\": \"ns\",$", MR_Next
},
163 {"\"Bar\": %float,$", MR_Next
},
164 {"\"Baz\": %float,$", MR_Next
},
165 {"\"Foo\": %float$", MR_Next
},
167 ADD_CASES(TC_CSVOut
, {{"^\"BM_CounterSet0_Tabular/threads:%int\",%csv_report,"
168 "%float,,%float,%float,,"}});
169 // VS2013 does not allow this function to be passed as a lambda argument
170 // to CHECK_BENCHMARK_RESULTS()
171 void CheckSet0(Results
const& e
) {
172 CHECK_COUNTER_VALUE(e
, int, "Foo", EQ
, 10);
173 CHECK_COUNTER_VALUE(e
, int, "Bar", EQ
, 20);
174 CHECK_COUNTER_VALUE(e
, int, "Baz", EQ
, 40);
176 CHECK_BENCHMARK_RESULTS("BM_CounterSet0_Tabular", &CheckSet0
);
179 void BM_CounterSet1_Tabular(benchmark::State
& state
) {
180 for (auto _
: state
) {
182 namespace bm
= benchmark
;
183 state
.counters
.insert({
184 {"Foo", {15, bm::Counter::kAvgThreads
}},
185 {"Bar", {25, bm::Counter::kAvgThreads
}},
186 {"Baz", {45, bm::Counter::kAvgThreads
}},
189 BENCHMARK(BM_CounterSet1_Tabular
)->ThreadRange(1, 16);
190 ADD_CASES(TC_JSONOut
, {{"\"name\": \"BM_CounterSet1_Tabular/threads:%int\",$"},
191 {"\"iterations\": %int,$", MR_Next
},
192 {"\"real_time\": %float,$", MR_Next
},
193 {"\"cpu_time\": %float,$", MR_Next
},
194 {"\"time_unit\": \"ns\",$", MR_Next
},
195 {"\"Bar\": %float,$", MR_Next
},
196 {"\"Baz\": %float,$", MR_Next
},
197 {"\"Foo\": %float$", MR_Next
},
199 ADD_CASES(TC_CSVOut
, {{"^\"BM_CounterSet1_Tabular/threads:%int\",%csv_report,"
200 "%float,,%float,%float,,"}});
201 // VS2013 does not allow this function to be passed as a lambda argument
202 // to CHECK_BENCHMARK_RESULTS()
203 void CheckSet1(Results
const& e
) {
204 CHECK_COUNTER_VALUE(e
, int, "Foo", EQ
, 15);
205 CHECK_COUNTER_VALUE(e
, int, "Bar", EQ
, 25);
206 CHECK_COUNTER_VALUE(e
, int, "Baz", EQ
, 45);
208 CHECK_BENCHMARK_RESULTS("BM_CounterSet1_Tabular/threads:%int", &CheckSet1
);
210 // ========================================================================= //
211 // ------------------------- Tabular Counters Output ----------------------- //
212 // ========================================================================= //
214 // set only some of the counters, different set now.
215 void BM_CounterSet2_Tabular(benchmark::State
& state
) {
216 for (auto _
: state
) {
218 namespace bm
= benchmark
;
219 state
.counters
.insert({
220 {"Foo", {10, bm::Counter::kAvgThreads
}},
221 {"Bat", {30, bm::Counter::kAvgThreads
}},
222 {"Baz", {40, bm::Counter::kAvgThreads
}},
225 BENCHMARK(BM_CounterSet2_Tabular
)->ThreadRange(1, 16);
226 ADD_CASES(TC_JSONOut
, {{"\"name\": \"BM_CounterSet2_Tabular/threads:%int\",$"},
227 {"\"iterations\": %int,$", MR_Next
},
228 {"\"real_time\": %float,$", MR_Next
},
229 {"\"cpu_time\": %float,$", MR_Next
},
230 {"\"time_unit\": \"ns\",$", MR_Next
},
231 {"\"Bat\": %float,$", MR_Next
},
232 {"\"Baz\": %float,$", MR_Next
},
233 {"\"Foo\": %float$", MR_Next
},
235 ADD_CASES(TC_CSVOut
, {{"^\"BM_CounterSet2_Tabular/threads:%int\",%csv_report,"
236 ",%float,%float,%float,,"}});
237 // VS2013 does not allow this function to be passed as a lambda argument
238 // to CHECK_BENCHMARK_RESULTS()
239 void CheckSet2(Results
const& e
) {
240 CHECK_COUNTER_VALUE(e
, int, "Foo", EQ
, 10);
241 CHECK_COUNTER_VALUE(e
, int, "Bat", EQ
, 30);
242 CHECK_COUNTER_VALUE(e
, int, "Baz", EQ
, 40);
244 CHECK_BENCHMARK_RESULTS("BM_CounterSet2_Tabular", &CheckSet2
);
246 // ========================================================================= //
247 // --------------------------- TEST CASES END ------------------------------ //
248 // ========================================================================= //
250 int main(int argc
, char* argv
[]) { RunOutputTests(argc
, argv
); }