The Gaudi Framework  v30r4 (9b837755)
ChronoStatSvc.cpp
Go to the documentation of this file.
1 #ifdef _WIN32
2 #pragma warning( disable : 4786 )
3 #endif
4 // ============================================================================
5 // STD & STL
6 // ============================================================================
7 #include <algorithm>
8 #include <fstream>
9 #include <functional>
10 #include <iomanip>
11 #include <iostream>
12 #include <string>
13 // ============================================================================
14 // GaudiKernel
15 // ============================================================================
19 #include "GaudiKernel/Kernel.h"
20 #include "GaudiKernel/MsgStream.h"
21 #include "GaudiKernel/Stat.h"
22 #include "GaudiKernel/StatEntity.h"
23 #include "GaudiKernel/StatusCode.h"
24 // ============================================================================
26 // ============================================================================
27 #include "ChronoStatSvc.h"
28 // ============================================================================
31 // ============================================================================
33 // ============================================================================
40 // ============================================================================
41 // ============================================================================
42 // comparison functor
43 // ============================================================================
44 constexpr struct CompareFirstOfPointerPair_t {
45  template <typename S, typename T>
46  inline bool operator()( const std::pair<S*, T*>& p1, const std::pair<S*, T*>& p2 ) const
47  {
48  auto e1 = p1.first;
49  auto e2 = p2.first;
50  return ( !e1 || !e2 ) || *e1 < *e2;
51  }
53 // ============================================================================
54 // Compound assignment operator.
55 // ============================================================================
57 {
58 
59  // Add the content of the maps, leave the rest unchanged
60 
61  // Merge Chronomaps
62  for ( auto& item : css.m_chronoEntities ) {
63  const IChronoStatSvc::ChronoTag& key = item.first;
64  const ChronoEntity& val = item.second;
65  if ( m_chronoEntities.count( key ) )
66  m_chronoEntities[key] += val;
67  else
69  }
70 
71  // Merge StatMaps
72  for ( auto& item : css.m_statEntities ) {
73  const IChronoStatSvc::StatTag& key = item.first;
74  const StatEntity& val = item.second;
75  if ( m_statEntities.count( key ) )
76  m_statEntities[key] += val;
77  else
78  m_statEntities.emplace( key, val );
79  }
80 }
81 // ============================================================================
82 // Implementation of IService::initialize()
83 // ============================================================================
85 {
87  if ( sc.isFailure() ) return sc;
89  // Set my own properties
90  sc = setProperties();
91 
92  if ( sc.isFailure() ) {
93  error() << "setting my properties" << endmsg;
94  return StatusCode::FAILURE;
95  }
96 
97  // only add an EndEvent listener if per-event output requested
98  if ( !m_perEventFile.empty() ) {
100  if ( !m_ofd.is_open() ) {
101  error() << "unable to open per-event output file \"" << m_perEventFile << "\"" << endmsg;
102  return StatusCode::FAILURE;
103  } else {
104  auto ii = serviceLocator()->service<IIncidentSvc>( "IncidentSvc" );
105  if ( !ii ) {
106  error() << "Unable to find IncidentSvc" << endmsg;
107  return StatusCode::FAILURE;
108  }
109  ii->addListener( this, IncidentType::EndEvent );
110  }
111  }
112 
114  m_printUserTime = true;
115  }
118  m_chronoTableFlag = true;
119  }
122  chronoStart( name() );
124  return StatusCode::SUCCESS;
125 }
126 // ============================================================================
127 // Implementation of IService::finalize()
128 // ============================================================================
130 {
131  std::string local = name() + ".finalize()";
133  MsgStream main_log( msgSvc(), local );
136  chronoStop( name() );
137 
138  if ( m_ofd.is_open() ) {
139  debug() << "writing per-event timing data to '" << m_perEventFile << "'" << endmsg;
140  for ( const auto& itr : m_perEvtTime ) {
141  m_ofd << itr.first.substr( 0, itr.first.length() - 8 ) << " ";
142  for ( const auto& itt : itr.second ) {
143  m_ofd << " " << (long int)( itt );
144  }
145  m_ofd << std::endl;
146  }
147 
148  m_ofd.close();
149  }
150 
155  MsgStream log( msgSvc(), "*****Chrono*****" );
156  const std::string stars( ( m_chronoCoutFlag ) ? 126 : 100, '*' );
157  if ( m_chronoCoutFlag ) {
158  std::cout << stars << std::endl;
159  std::cout << local << " The Final CPU consumption (Chrono) Table "
160  << ( m_chronoOrderFlag ? "(ordered)" : "(not ordered)" ) << std::endl;
161  std::cout << stars << std::endl;
162  } else {
163  log << (MSG::Level)m_chronoPrintLevel << stars << endmsg;
164  log << (MSG::Level)m_chronoPrintLevel << " The Final CPU consumption ( Chrono ) Table "
165  << ( m_chronoOrderFlag ? "(ordered)" : "(not ordered)" ) << endmsg;
166  log << (MSG::Level)m_chronoPrintLevel << stars << endmsg;
167  }
169  { // prepare container for printing
171  tmpCont.reserve( m_chronoEntities.size() );
172  for ( auto& it : m_chronoEntities ) {
173  tmpCont.emplace_back( &it.second, &it.first );
174  }
175  // sort it
176  if ( m_chronoOrderFlag ) std::sort( tmpCont.begin(), tmpCont.end(), CompareFirstOfPointerPair );
177  // print User Time statistics
178  if ( m_printUserTime ) {
179  for ( auto iter = tmpCont.begin(); tmpCont.end() != iter; ++iter ) {
180  //
181  ChronoEntity* entity = iter->first;
182  if ( !entity ) {
183  continue;
184  }
185  const ChronoTag* tag = iter->second;
186  if ( !tag ) {
187  continue;
188  }
189  entity->stop();
191  if ( m_chronoCoutFlag )
193  {
194  std::cout << *tag << "\t" << entity->outputUserTime() << std::endl;
195  } else
196  {
197  MsgStream( msgSvc(), *tag ) << m_chronoPrintLevel << entity->outputUserTime() << endmsg;
198  }
199  //
200  }
201  }
203  if ( m_printSystemTime ) {
207  std::cout << stars << std::endl;
208  } else if ( m_printUserTime && !m_chronoCoutFlag ) {
209  log << (MSG::Level)m_chronoPrintLevel << stars << endmsg;
210  }
212  for ( auto iter = tmpCont.begin(); tmpCont.end() != iter; ++iter ) {
214  ChronoEntity* entity = iter->first;
215  if ( !entity ) {
216  continue;
217  }
218  const ChronoTag* tag = iter->second;
219  if ( !tag ) {
220  continue;
221  }
222  entity->stop();
224  if ( m_chronoCoutFlag )
226  {
227  std::cout << *tag << "\t" << entity->outputSystemTime() << std::endl;
228  } else
229  {
230  MsgStream( msgSvc(), *tag ) << m_chronoPrintLevel << entity->outputSystemTime() << endmsg;
231  }
232  //
233  }
234  }
236  if ( m_printEllapsedTime ) {
240  std::cout << stars << std::endl;
241  } else if ( ( m_printUserTime || m_printSystemTime ) && !m_chronoCoutFlag ) {
242  log << (MSG::Level)m_chronoPrintLevel << stars << endmsg;
243  }
245  for ( const auto& i : tmpCont ) {
247  ChronoEntity* entity = i.first;
248  if ( !entity ) {
249  continue;
250  }
251  const ChronoTag* tag = i.second;
252  if ( !tag ) {
253  continue;
254  }
255  entity->stop();
257  if ( m_chronoCoutFlag )
259  {
260  std::cout << *tag << "\t" << entity->outputElapsedTime() << std::endl;
261  } else
262  {
263  MsgStream( msgSvc(), *tag ) << m_chronoPrintLevel << entity->outputElapsedTime() << endmsg;
264  }
265  //
266  }
267  }
269  tmpCont.clear();
270  }
272  if ( m_chronoCoutFlag ) {
273  std::cout << stars << std::endl;
274  } else {
275  log << m_chronoPrintLevel << stars << endmsg;
276  }
277  }
278 
280 
282  if ( m_statTableFlag ) {
283  printStats();
284  }
285 
286  if ( !m_statsOutFileName.value().empty() ) {
287  saveStats();
288  }
289 
290  main_log << MSG::INFO << " Service finalized successfully " << endmsg;
291 
292  return Service::finalize();
293 }
294 // ============================================================================
295 // Implementation of IChronoStatSvc::chronoStart
296 // ============================================================================
297 ChronoEntity* ChronoStatSvc::chronoStart( const ChronoTag& chronoTag )
298 {
299  ChronoEntity& entity = m_chronoEntities[chronoTag];
300  entity.start();
301  return &entity;
302 }
303 // ============================================================================
304 // Implementation of IChronoStatSvc::chronoStop
305 // ============================================================================
306 const ChronoEntity* ChronoStatSvc::chronoStop( const IChronoStatSvc::ChronoTag& chronoTag )
307 {
308  ChronoEntity& entity = m_chronoEntities[chronoTag];
309  entity.stop();
310  return &entity;
311 }
312 // ============================================================================
313 // Implementation of IChronoStatSvc::chronoDelta
314 // ============================================================================
315 IChronoStatSvc::ChronoTime ChronoStatSvc::chronoDelta( const IChronoStatSvc::ChronoTag& chronoTag,
316  IChronoStatSvc::ChronoType theType )
317 {
318  return m_chronoEntities[chronoTag].delta( theType );
319 }
320 // ============================================================================
321 // Implementation of IChronoStatSvc::chronoPrint
322 // ============================================================================
323 void ChronoStatSvc::chronoPrint( const IChronoStatSvc::ChronoTag& chronoTag )
324 {
325  MsgStream log( msgSvc(), chronoTag );
326  if ( m_printUserTime ) {
327  log << (MSG::Level)m_chronoPrintLevel << m_chronoEntities[chronoTag].outputUserTime() << endmsg;
328  }
329  if ( m_printSystemTime ) {
330  log << (MSG::Level)m_chronoPrintLevel << m_chronoEntities[chronoTag].outputSystemTime() << endmsg;
331  }
332 }
333 // ============================================================================
334 // Implementation of IChronoSvc::chronoStatus
335 // ============================================================================
336 IChronoStatSvc::ChronoStatus ChronoStatSvc::chronoStatus( const IChronoStatSvc::ChronoTag& chronoTag )
337 {
338  return m_chronoEntities[chronoTag].status();
339 }
340 // ============================================================================
341 // Implementation of IChronoStatSvc::stat
342 // ============================================================================
343 void ChronoStatSvc::stat( const IChronoStatSvc::StatTag& statTag, const IChronoStatSvc::StatFlag& statFlag )
344 {
345  auto theIter = m_statEntities.find( statTag );
346 
347  StatEntity* theStat = nullptr;
348  // if new entity, specify the number of events to be skipped
349  if ( theIter == m_statEntities.end() ) {
350  // new stat entity
351  StatEntity& theSe = m_statEntities[statTag];
352  theStat = &theSe;
353  } else {
354  // existing stat entity
355  theStat = &theIter->second;
356  }
357 
358  theStat->addFlag( statFlag );
359 }
360 // ============================================================================
361 // Implementation of IChronoStatSvc::statPrint
362 // ============================================================================
363 void ChronoStatSvc::statPrint( const IChronoStatSvc::StatTag& statTag )
364 {
365  MsgStream log( msgSvc(), statTag );
366  log << (MSG::Level)m_statPrintLevel << m_statEntities[statTag] << endmsg;
367 }
368 // ============================================================================
369 /* extract the chrono entity for the given tag (name)
370  * @see IChronoStatSvc
371  * @param t chrono tag(name)
372  * @return pointer to chrono entity
373  */
374 // ============================================================================
375 const ChronoEntity* ChronoStatSvc::chrono( const IChronoStatSvc::ChronoTag& t ) const
376 {
377  auto it = m_chronoEntities.find( t );
378  return m_chronoEntities.end() != it ? &( it->second ) : nullptr;
379 }
380 // ============================================================================
381 /* extract the stat entity for the given tag (name)
382  * @see IChronoStatSvc
383  * @param t stat tag(name)
384  * @return pointer to stat entity
385  */
386 // ============================================================================
387 StatEntity* ChronoStatSvc::stat( const IChronoStatSvc::StatTag& t )
388 {
389  auto it = m_statEntities.find( t );
390  return m_statEntities.end() != it ? &( it->second ) : nullptr;
391 }
392 // ============================================================================
393 // dump all the statistics into an ASCII file
394 // ============================================================================
396 {
397  std::ofstream out( m_statsOutFileName.value(), std::ios_base::out | std::ios_base::trunc );
398  if ( !out.good() ) {
399  info() << "Could not open the output file for writing chrono statistics [" << m_statsOutFileName.value() << "]"
400  << endmsg;
401  return;
402  } else {
403  // format it our way
404  out << std::scientific << std::setprecision( 8 );
405  }
406 
407  // ChronoEntity
409  chronos.reserve( m_chronoEntities.size() );
411  []( ChronoMap::const_reference i ) { return std::make_pair( &i.second, &i.first ); } );
412 
413  // sort it
414  std::sort( std::begin( chronos ), std::end( chronos ), CompareFirstOfPointerPair );
415 
416  // print User Time statistics
417  for ( const auto& iter : chronos ) {
418  //
419  const ChronoEntity* entity = iter.first;
420  if ( !entity ) {
421  continue;
422  }
423 
424  const ChronoTag* tag = iter.second;
425  if ( !tag ) {
426  continue;
427  }
428 
429  // create an entry in the .INI-like table
430  out << "\n[" << *tag << "]\n";
431 
432  // user
433  out << "cpu_user_total = " << entity->uTotalTime() << "\n";
434  out << "cpu_user_min = " << entity->uMinimalTime() << "\n";
435  out << "cpu_user_mean = " << entity->uMeanTime() << "\n";
436  out << "cpu_user_RMS = " << entity->uRMSTime() << "\n";
437  out << "cpu_user_max = " << entity->uMaximalTime() << "\n";
438  out << "cpu_user_nbr = " << entity->nOfMeasurements() << "\n";
439 
440  // system
441  out << "\n"; // just for clarity
442  out << "cpu_system_total = " << entity->kTotalTime() << "\n";
443  out << "cpu_system_min = " << entity->kMinimalTime() << "\n";
444  out << "cpu_system_mean = " << entity->kMeanTime() << "\n";
445  out << "cpu_system_RMS = " << entity->kRMSTime() << "\n";
446  out << "cpu_system_max = " << entity->kMaximalTime() << "\n";
447  out << "cpu_system_nbr = " << entity->nOfMeasurements() << "\n";
448 
449  // real
450  out << "\n"; // just for clarity
451  out << "cpu_real_total = " << entity->eTotalTime() << "\n";
452  out << "cpu_real_min = " << entity->eMinimalTime() << "\n";
453  out << "cpu_real_mean = " << entity->eMeanTime() << "\n";
454  out << "cpu_real_RMS = " << entity->eRMSTime() << "\n";
455  out << "cpu_real_max = " << entity->eMaximalTime() << "\n";
456  out << "cpu_real_nbr = " << entity->nOfMeasurements() << "\n";
457  }
458 
459  out << std::endl;
460 }
461 // ============================================================================
462 // print the "Stat" part of the ChronoStatSvc
463 // ============================================================================
465 {
467  if ( m_statEntities.empty() ) {
468  return;
469  }
470 
471  MsgStream log( msgSvc(), "******Stat******" );
473  const std::string stars( ( m_statCoutFlag ) ? 126 : 100, '*' );
475  if ( m_statCoutFlag ) {
476  std::cout << stars << std::endl;
477  std::cout << " The Final stat Table " << ( m_statOrderFlag ? "(ordered)" : "(not ordered)" ) << std::endl;
478  std::cout << stars << std::endl;
479  } else {
480  log << m_statPrintLevel << stars << endmsg;
481  log << m_statPrintLevel << " The Final stat Table " << ( m_statOrderFlag ? "(ordered)" : "(not ordered)" )
482  << endmsg;
483  log << m_statPrintLevel << stars << endmsg;
484  }
485 
486  {
487  // prepare container for printing
489  typedef std::vector<SPair> SCont;
490  SCont tmpCont;
492  []( StatMap::const_reference i ) { return std::make_pair( &i.second, &i.first ); } );
493  // sort it
494  if ( m_statOrderFlag ) std::sort( tmpCont.begin(), tmpCont.end(), CompareFirstOfPointerPair );
495  // print the table header
496  if ( m_statCoutFlag ) {
497  std::cout << m_header.value() << std::endl;
498  } else {
499  log << m_statPrintLevel << m_header.value() << endmsg;
500  }
501 
502  // loop over counters and print them:
503  for ( const auto& iter : tmpCont ) {
505  const StatEntity* entity = iter.first;
506  if ( !entity ) {
507  continue;
508  }
509  const StatTag* tag = iter.second;
510  if ( !tag ) {
511  continue;
512  }
513  if ( m_statCoutFlag ) {
515  entity->print( std::cout, true, *tag, m_useEffFormat, "%|-15.15s|%|17t|" );
516  } else {
517  std::ostringstream ost;
518  entity->print( ost, true, *tag, m_useEffFormat, "%|-15.15s|%|17t|" );
519  log << m_statPrintLevel << ost.str() << endmsg;
520  }
521  }
522  tmpCont.clear();
523  }
525  if ( m_statCoutFlag ) {
526  std::cout << stars << std::endl;
527  } else {
528  log << m_statPrintLevel << stars << endmsg;
529  }
530 }
531 
532 // ============================================================================
533 
534 void ChronoStatSvc::handle( const Incident& /* inc */ )
535 {
536 
537  if ( !m_ofd.is_open() ) return;
538 
539  for ( const auto& itr : m_chronoEntities ) {
540  if ( itr.first.find( ":Execute" ) == std::string::npos ) continue;
541 
542  auto itm = m_perEvtTime.find( itr.first );
543  if ( itm == m_perEvtTime.end() ) {
544  m_perEvtTime[itr.first] = {itr.second.delta( IChronoSvc::ELAPSED )};
545  } else {
546  itm->second.push_back( itr.second.delta( IChronoSvc::ELAPSED ) );
547  }
548  }
549 }
550 
551 // ============================================================================
552 // The END
553 // ============================================================================
std::string outputElapsedTime() const
print the chrono ;
constexpr static const auto FAILURE
Definition: StatusCode.h:88
double kMaximalTime() const
maximal measurement for kernel time
Definition: ChronoEntity.h:199
Definition of the MsgStream class used to transmit messages.
Definition: MsgStream.h:24
StatusCode initialize() override
Definition: Service.cpp:63
T empty(T...args)
double uMinimalTime() const
minimal measurement for user time
Definition: ChronoEntity.h:183
T open(T...args)
const std::string & name() const override
Retrieve name of the service.
Definition: Service.cpp:288
double uTotalTime() const
total user time
Definition: ChronoEntity.h:207
ChronoStatus chronoStatus(const IChronoStatSvc::ChronoTag &chronoTag) override
Implementation of IChronoStatSvc::chronoStatus.
Gaudi::Property< std::string > m_header
StatusCode finalize() override
Definition: Service.cpp:173
MsgStream & info() const
shortcut for the method msgStream(MSG::INFO)
StatMap m_statEntities
stat part
a small helper class for implementation of ChronoStatSvc service, It also could be used as some local...
Definition: ChronoEntity.h:21
Gaudi::Property< bool > m_statCoutFlag
IChronoStatSvc::ChronoTime chronoDelta(const IChronoStatSvc::ChronoTag &chronoTag, IChronoStatSvc::ChronoType theType) override
Implementation of IchronoStatSvc::chronoDelta.
double kTotalTime() const
total Kernel time
Definition: ChronoEntity.h:211
T endl(T...args)
Gaudi::Property< bool > m_chronoOrderFlag
Gaudi::Property< bool > m_printUserTime
void stat(const IChronoStatSvc::StatTag &statTag, const IChronoStatSvc::StatFlag &statFlag) override
Implementation of IChronoStatSvc::stat add statistical information to the entity , tagged by its name.
double uRMSTime() const
r.m.s User Time
Definition: ChronoEntity.h:239
T end(T...args)
double kMinimalTime() const
minimal measurement for kernel time
Definition: ChronoEntity.h:187
double eMinimalTime() const
minimal measurement for elapsed time
Definition: ChronoEntity.h:191
double kRMSTime() const
r.m.s Kernel Time
Definition: ChronoEntity.h:235
void statPrint(const IChronoStatSvc::ChronoTag &statTag) override
prints (using message service) info about statistical entity, tagged by its name
std::string outputSystemTime() const
print the chrono ;
IChronoSvc::ChronoStatus start()
start the current chrono
bool isFailure() const
Definition: StatusCode.h:139
STL class.
#define DECLARE_COMPONENT(type)
const ChronoEntity * chrono(const IChronoStatSvc::ChronoTag &t) const override
extract the chrono entity for the given tag (name)
double kMeanTime() const
average Kernel Time
Definition: ChronoEntity.h:223
StatusCode service(const Gaudi::Utils::TypeNameString &name, T *&svc, bool createIf=true)
Templated method to access a service by name.
Definition: ISvcLocator.h:79
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
STL class.
double eMeanTime() const
average Elapsed Time
Definition: ChronoEntity.h:231
void merge(const ChronoStatSvc &css)
Compound assignment operator.
bool operator()(const std::pair< S *, T * > &p1, const std::pair< S *, T * > &p2) const
Gaudi::Property< bool > m_useEffFormat
void saveStats()
dump the statistics into an ASCII file for offline processing
constexpr struct CompareFirstOfPointerPair_t CompareFirstOfPointerPair
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:51
void clear(STATE_TYPE _i=std::ios_base::failbit)
Definition: MsgStream.h:187
TimeMap m_perEvtTime
T close(T...args)
const ChronoEntity * chronoStop(const IChronoStatSvc::ChronoTag &chronoTag) override
Implementation of IChronoStatSvc::chronoStop.
Gaudi::Property< bool > m_statOrderFlag
T make_pair(T...args)
double eRMSTime() const
r.m.s Elapsed Time
Definition: ChronoEntity.h:243
std::ostream & print(std::ostream &o, bool tableFormat, const std::string &name, bool flag=true, std::string fmtHead="%|-48.48s|%|27t|") const
Definition: Counters.h:967
Gaudi::Property< bool > m_chronoTableFlag
const SmartIF< IMessageSvc > & msgSvc() const
The standard message service.
T clear(T...args)
std::ofstream m_ofd
StatusCode setProperties()
Method for setting declared properties to the values specified for the job.
Definition: Service.cpp:294
constexpr static const auto SUCCESS
Definition: StatusCode.h:87
T count(T...args)
T scientific(T...args)
MSG::Level m_chronoPrintLevel
level of info printing
StatusCode initialize() override
Implementation of IService::initialize()
Gaudi::Property< bool > m_printEllapsedTime
T insert(T...args)
double uMeanTime() const
average User Time
Definition: ChronoEntity.h:227
std::string outputUserTime() const
print the chrono ;
T find(T...args)
T size(T...args)
HepRndm::Engine< TripleRand > e2
STL class.
MsgStream & debug() const
shortcut for the method msgStream(MSG::DEBUG)
T begin(T...args)
void handle(const Incident &incident) override
T back_inserter(T...args)
Gaudi::Property< bool > m_statTableFlag
double eMaximalTime() const
maximal measurement for elapsed time
Definition: ChronoEntity.h:203
Base class for all Incidents (computing events).
Definition: Incident.h:17
ChronoEntity * chronoStart(const IChronoStatSvc::ChronoTag &chronoTag) override
Implementation of IChronoStatSvc::chronoStart.
unsigned long addFlag(const double v)
Definition: Counters.h:935
T emplace(T...args)
unsigned long nOfMeasurements() const
number of chrono measurements
Definition: ChronoEntity.h:179
Gaudi::Property< std::string > m_statsOutFileName
MSG::Level m_statPrintLevel
level of info printing
Gaudi::Property< bool > m_chronoCoutFlag
T sort(T...args)
T transform(T...args)
backward compatible StatEntity class.
Definition: Counters.h:855
T is_open(T...args)
IChronoSvc::ChronoStatus stop()
stop the chrono
double uMaximalTime() const
maximal measurement for user time
Definition: ChronoEntity.h:195
T setprecision(T...args)
double eTotalTime() const
total Elapsed time
Definition: ChronoEntity.h:215
void chronoPrint(const IChronoStatSvc::ChronoTag &chronoTag) override
Implementation of IChronoStatSvc::chronoPrint.
SmartIF< ISvcLocator > & serviceLocator() const override
Retrieve pointer to service locator.
Definition: Service.cpp:291
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209
The interface implemented by the IncidentSvc service.
Definition: IIncidentSvc.h:23
The Chrono & Stat Sservice: service implements the IChronoStatSvc interface and provides the basic ch...
Definition: ChronoStatSvc.h:33
T reserve(T...args)
ChronoMap m_chronoEntities
chrono part
T emplace_back(T...args)
Gaudi::Property< bool > m_printSystemTime
StatusCode finalize() override
Implementation of IService::finalize()
Gaudi::Property< std::string > m_perEventFile