39 return prefix +
"::" + name;
44 PerformanceMonitor::PerformanceMonitor()
48 m_all_enabled =
false;
51 PerformanceMonitor::~PerformanceMonitor()
58 if (m_instance == NULL)
71 for (
uint32_t i = 0; i < num_names; ++i)
72 monitor->
m_buffer[i].reserve(num_events);
78 bool PerformanceMonitor::isEnabled(
string prefix)
80 return (m_enabled && m_enabled_prefix.find(prefix) != m_enabled_prefix.end()) || m_all_enabled;
83 void PerformanceMonitor::start(
string timer_name)
85 if (getInstance()->m_enabled)
88 getInstance()->m_timer[timer_name] = t;
92 double PerformanceMonitor::measurement(
string timer_name,
string description,
string prefix,
100 double double_ms = d.
toNSec() / 1000000.0;
101 monitor->
addEvent(prefix, description, double_ms);
103 if (getInstance()->m_print_stop)
105 std::stringstream ss;
106 ss <<
makeName(prefix, description) <<
": " << double_ms <<
" ms";
107 monitor->
print(ss.str(), level);
114 double PerformanceMonitor::startStop(
string timer_name,
string description,
string prefix,
125 if (getInstance()->isEnabled(prefix))
133 double double_ms = d.
toNSec() / 1000000.0;
134 monitor->
addEvent(prefix, description, double_ms);
135 monitor->
m_timer[timer_name] = end;
136 if (getInstance()->m_print_stop)
138 std::stringstream ss;
139 ss <<
makeName(prefix, description) <<
": " << double_ms <<
" ms";
140 monitor->
print(ss.str(), level);
146 PerformanceMonitor::start(timer_name);
152 void PerformanceMonitor::addStaticData(
string name,
double data,
string prefix)
154 if (getInstance()->isEnabled(prefix))
156 string tmp =
makeName(prefix, name);
157 getInstance()->m_static_data[tmp] = data;
161 void PerformanceMonitor::addData(
string name,
double data,
string prefix)
163 if (getInstance()->isEnabled(prefix))
165 getInstance()->addEvent(prefix, name, data);
169 void PerformanceMonitor::addNonTimeData(
string name,
double data,
string prefix)
171 if (getInstance()->isEnabled(prefix))
173 getInstance()->addNonTimeEvent(prefix, name, data);
177 void PerformanceMonitor::addEvent(
string prefix,
string name,
double data)
179 if (getInstance()->isEnabled(prefix))
181 string tmp =
makeName(prefix, name);
182 if (m_data.find(tmp) == m_data.end())
184 m_data[tmp] = vector<double>();
185 if (m_buffer.size() > 0)
187 m_data[tmp].swap(m_buffer.back());
191 m_data[tmp].push_back(data);
195 void PerformanceMonitor::addNonTimeEvent(
string prefix,
string name,
double data)
197 if (getInstance()->isEnabled(prefix))
199 string tmp =
makeName(prefix, name);
200 if (m_data_nontime.find(tmp) == m_data_nontime.end())
202 m_data_nontime[tmp] = vector<double>();
203 if (m_buffer.size() > 0)
205 m_data_nontime[tmp].swap(m_buffer.back());
209 m_data_nontime[tmp].push_back(data);
241 void PerformanceMonitor::createStatisticSummary(stringstream& ss,
string prefix,
string name)
243 string tmp =
makeName(prefix, name);
244 double median, min, max;
245 getMedian(tmp, median, min, max);
247 ss <<
"Summary for " << tmp <<
"\n" <<
248 "Called " << m_data[tmp].size() <<
" times\n" <<
249 name <<
"_avg: " << getAverage(tmp) <<
" ms\n" <<
250 name <<
"_median: " << median <<
" ms\n" <<
251 name <<
"_min: " << min <<
" ms\n" <<
252 name <<
"_max: " << max <<
" ms\n"<<
256 void PerformanceMonitor::createStatisticSummaryNonTime(stringstream& ss,
string prefix,
string name)
258 string tmp =
makeName(prefix, name);
259 double median, min, max;
260 getMedianNonTime(tmp, median, min, max);
262 ss <<
"Summary for " << tmp <<
"\n" <<
263 "num entries: " << m_data_nontime[tmp].size() <<
"\n" <<
264 name <<
"_avg: " << getAverageNonTime(tmp) <<
"\n" <<
265 name <<
"_median: " << median <<
"\n" <<
266 name <<
"_min: " << min <<
"\n" <<
267 name <<
"_max: " << max <<
"\n"<<
271 void PerformanceMonitor::printSummary(
string prefix,
string name,
276 std::stringstream ss;
278 monitor->
print(ss.str(), level);
281 void PerformanceMonitor::enablePrefix(
string prefix)
291 void PerformanceMonitor::enableAll(
const bool& enabled)
293 getInstance()->m_all_enabled = enabled;
296 void PerformanceMonitor::disablePrefix(
string prefix)
313 printSummaryFromPrefix(it->first, level);
321 std::stringstream ss;
322 ss <<
"\n########## Begin of Summary for prefix " << prefix <<
" ##########\n";
325 size_t prefix_end = it->first.find(
"::");
326 std::string prefix_tmp = it->first.substr(0, prefix_end);
328 if (prefix == prefix_tmp)
332 ss <<
"#### Static data: ####\n";
335 ss << it->first.substr(prefix_end+2) <<
": " << it->second <<
"\n";
340 for (map<
string, vector<double> >::iterator it = monitor->
m_data.begin(); it != monitor->
m_data.end(); it++)
342 size_t prefix_end = it->first.find(
"::");
343 std::string prefix_tmp = it->first.substr(0, prefix_end);
345 if (prefix == prefix_tmp)
349 ss <<
"#### Time data: ####\n";
352 string name = it->first.substr(prefix_end+2);
360 size_t prefix_end = it->first.find(
"::");
361 std::string prefix_tmp = it->first.substr(0, prefix_end);
363 if (prefix == prefix_tmp)
367 ss <<
"#### Non-time data: ####\n";
370 string name = it->first.substr(prefix_end+2);
374 monitor->
print(ss.str(), level);
377 double PerformanceMonitor::getAverage(
string name)
380 vector<double>* tmp = &m_data[name];
381 int n = (int) m_data[name].size();
382 for (
int i = 0; i < n; ++i)
383 avg = avg + tmp->at(i);
388 double PerformanceMonitor::getAverageNonTime(
string name)
391 vector<double>* tmp = &m_data_nontime[name];
392 int n = (int) m_data_nontime[name].size();
393 for (
int i = 0; i < n; ++i)
394 avg = avg + tmp->at(i);
399 void PerformanceMonitor::getMedian(
string name,
double& median,
double& min,
double& max)
401 vector<double> tmp = m_data[name];
402 sort(tmp.begin(), tmp.end());
403 median = tmp[tmp.size() / 2];
405 max = tmp[tmp.size() - 1];
408 void PerformanceMonitor::getMedianNonTime(
string name,
double& median,
double& min,
double& max)
410 vector<double> tmp = m_data_nontime[name];
411 sort(tmp.begin(), tmp.end());
413 median = tmp[tmp.size() / 2];
415 max = tmp[tmp.size() - 1];
Represents absolute times.
bool initialize(int &argc, char *argv[], bool remove_read_arguments)
#define LOGGING_INFO(streamname, arg)
#define LOGGING_DEBUG(streamname, arg)
string makeName(string prefix, string name)
ThreadStream & endl(ThreadStream &stream)
Repesents absolute times.
#define LOGGING_TRACE(streamname, arg)