reporter_output_test.cc 55 KB

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