artdaq  v3_09_06
tracemf.cc
1 // This file (just.cc) was created by Ron Rechenmacher <ron@fnal.gov> on
2 // Feb 19, 2014. "TERMS AND CONDITIONS" governing this file are in the README
3 // or COPYING file. If you do not have such a file, one can be obtained by
4 // contacting Ron or Fermi Lab in Batavia IL, 60510, phone: 630-840-3000.
5 // $RCSfile: just_user.cc,v $
6 
7 #include "artdaq/DAQdata/Globals.hh"
8 
9 #include <boost/program_options.hpp>
10 
11 #include <iomanip>
12 namespace bpo = boost::program_options;
13 
14 std::string formatTime(double time)
15 {
16  std::ostringstream o;
17  o << std::fixed << std::setprecision(3);
18  if (time > 60)
19  {
20  o << static_cast<int>(time / 60) << " m " << time - 60 * static_cast<int>(time / 60) << " s";
21  }
22  else if (time > 1)
23  {
24  o << time << " s";
25  }
26  else
27  {
28  time *= 1000;
29  if (time > 1)
30  {
31  o << time << " ms";
32  }
33  else
34  {
35  time *= 1000;
36  if (time > 1)
37  {
38  o << time << " us";
39  }
40  else
41  {
42  time *= 1000;
43  o << time << " ns";
44  }
45  }
46  }
47 
48  return o.str();
49 }
50 
51 int main(int argc, char *argv[]) try
52 {
53  std::ostringstream descstr;
54  descstr << *argv
55  << " <-l test loops> [csutdi]";
56  bpo::options_description desc(descstr.str());
57  desc.add_options()("loops,l", bpo::value<size_t>(), "Number of times to run each test")("C,c", "Run TRACEC test")("S,s", "Run TRACES test")("U,u", "Run TRACE_ test")("T,t", "Run TRACE_STREAMER test")("D,d", "Run TLOG_DEBUG test")("I,i", "Run TLOG_INFO test")("console,x", "Enable MessageFacility output to console")("help,h", "produce help message");
58  bpo::variables_map vm;
59  try
60  {
61  bpo::store(bpo::command_line_parser(argc, argv).options(desc).run(), vm);
62  bpo::notify(vm);
63  }
64  catch (bpo::error const &e)
65  {
66  std::cerr << "Exception from command line processing in " << *argv
67  << ": " << e.what() << "\n";
68  return -1;
69  }
70  if (vm.count("help") != 0u)
71  {
72  std::cout << desc << std::endl;
73  return 1;
74  }
75  if (vm.count("loops") == 0u)
76  {
77  std::cerr << "Exception from command line processing in " << *argv
78  << ": no loop count given.\n"
79  << "For usage and an options list, please do '"
80  << *argv << " --help"
81  << "'.\n";
82  return 2;
83  }
84  size_t loops = vm["loops"].as<size_t>();
85 
86  artdaq::configureMessageFacility("tracemf", vm.count("console") != 0u);
87 
88  if (vm.count("C") != 0u)
89  {
90  std::cout << "Starting TRACEC test" << std::endl;
91  auto start = std::chrono::steady_clock::now();
92  for (size_t l = 0; l < loops; ++l)
93  {
94  TRACE(TLVL_DEBUG, "Test TRACEC with an int %i and a float %.1f", 42, 5.56); // NOLINT
95  }
96  auto time = std::chrono::duration_cast<std::chrono::duration<double>>(std::chrono::steady_clock::now() - start).count();
97  std::cout << "TRACEC test took " << formatTime(time) << ", avg: " << formatTime(time / loops) << std::endl;
98  }
99 
100  if (vm.count("S") != 0u)
101  {
102  std::cout << "Starting TRACES test" << std::endl;
103  auto start = std::chrono::steady_clock::now();
104  for (size_t l = 0; l < loops; ++l)
105  {
106  std::string test = "Test TRACE with an int %d";
107  std::string test2 = " and a float %.1f";
108  TRACE(TLVL_DEBUG, test + test2, 42, 5.56); // NOLINT
109  }
110  auto time = std::chrono::duration_cast<std::chrono::duration<double>>(std::chrono::steady_clock::now() - start).count();
111  std::cout << "TRACES test took " << formatTime(time) << ", avg: " << formatTime(time / loops) << std::endl;
112  }
113 
114  if (vm.count("U") != 0u)
115  {
116  std::cout << "Starting TRACE_ test" << std::endl;
117  auto start = std::chrono::steady_clock::now();
118  for (size_t l = 0; l < loops; ++l)
119  {
120  TRACEN_("tracemf", TLVL_DEBUG, "Test TRACE_ with an int " << 42 << " and a float %.1f", 5.56); // NOLINT
121  }
122  auto time = std::chrono::duration_cast<std::chrono::duration<double>>(std::chrono::steady_clock::now() - start).count();
123  std::cout << "TRACE_ test took " << formatTime(time) << ", avg: " << formatTime(time / loops) << std::endl;
124  }
125 
126  if (vm.count("D") != 0u)
127  {
128  std::cout << "Starting TLOG_DEBUG test" << std::endl;
129  auto start = std::chrono::steady_clock::now();
130  for (size_t l = 0; l < loops; ++l)
131  {
132  TLOG_DEBUG("tracemf") << "Test TLOG_DEBUG with an int " << 42 << " and a float " << std::setprecision(1) << 5.56 << ", and another float " << 7.3 << TRACE_ENDL;
133  }
134  auto time = std::chrono::duration_cast<std::chrono::duration<double>>(std::chrono::steady_clock::now() - start).count();
135  std::cout << "TLOG_DEBUG test took " << formatTime(time) << ", avg: " << formatTime(time / loops) << std::endl;
136  }
137 
138  if (vm.count("I") != 0u)
139  {
140  std::cout << "Starting TLOG_INFO test" << std::endl;
141  auto start = std::chrono::steady_clock::now();
142  for (size_t l = 0; l < loops; ++l)
143  {
144  TLOG_INFO("tracemf") << "Test TLOG_INFO with an int " << 42 << " and a float " << std::setprecision(1) << 5.56 << ", and another float " << std::fixed << 7.3 << TRACE_ENDL;
145  }
146  auto time = std::chrono::duration_cast<std::chrono::duration<double>>(std::chrono::steady_clock::now() - start).count();
147  std::cout << "TLOG_INFO test took " << formatTime(time) << ", avg: " << formatTime(time / loops) << std::endl;
148  }
149 
150  return (0);
151 }
152 catch (...)
153 {
154  return -1;
155 }