The Gaudi Framework  v33r0 (d5ea422b)
ChronoStatSvc.cpp
Go to the documentation of this file.
1 /***********************************************************************************\
2 * (c) Copyright 1998-2019 CERN for the benefit of the LHCb and ATLAS collaborations *
3 * *
4 * This software is distributed under the terms of the Apache version 2 licence, *
5 * copied verbatim in the file "LICENSE". *
6 * *
7 * In applying this licence, CERN does not waive the privileges and immunities *
8 * granted to it by virtue of its status as an Intergovernmental Organization *
9 * or submit itself to any jurisdiction. *
10 \***********************************************************************************/
11 #ifdef _WIN32
12 # pragma warning( disable : 4786 )
13 #endif
14 // ============================================================================
15 // STD & STL
16 // ============================================================================
17 #include <algorithm>
18 #include <fstream>
19 #include <functional>
20 #include <iomanip>
21 #include <iostream>
22 #include <string>
23 // ============================================================================
24 // GaudiKernel
25 // ============================================================================
30 #include "GaudiKernel/Kernel.h"
31 #include "GaudiKernel/MsgStream.h"
32 #include "GaudiKernel/Stat.h"
33 #include "GaudiKernel/StatEntity.h"
34 #include "GaudiKernel/StatusCode.h"
35 // ============================================================================
37 // ============================================================================
38 #include "ChronoStatSvc.h"
39 // ============================================================================
42 // ============================================================================
44 // ============================================================================
51 // ============================================================================
52 // ============================================================================
53 // comparison functor
54 // ============================================================================
55 constexpr struct CompareFirstOfPointerPair_t {
56  template <typename S, typename T>
57  inline bool operator()( const std::pair<S*, T*>& p1, const std::pair<S*, T*>& p2 ) const {
58  auto e1 = p1.first;
59  auto e2 = p2.first;
60  return ( !e1 || !e2 ) || *e1 < *e2;
61  }
63 // ============================================================================
64 // Compound assignment operator.
65 // ============================================================================
66 void ChronoStatSvc::merge( const ChronoStatSvc& css ) {
67 
68  // Add the content of the maps, leave the rest unchanged
69 
70  lock_t lock( m_mutex );
71  lock_t otherLock( css.m_mutex );
72 
73  // Merge Chronomaps
74  for ( auto& item : css.m_chronoEntities ) {
75  const IChronoStatSvc::ChronoTag& key = item.first;
76  const ChronoEntity& val = item.second;
77  if ( m_chronoEntities.count( key ) )
78  m_chronoEntities[key] += val;
79  else
81  }
82 
83  // Merge StatMaps
84  for ( auto& item : css.m_statEntities ) {
85  const IChronoStatSvc::StatTag& key = item.first;
86  const StatEntity& val = item.second;
87  if ( m_statEntities.count( key ) )
88  m_statEntities[key] += val;
89  else
90  m_statEntities.emplace( key, val );
91  }
92 }
93 // ============================================================================
94 // Implementation of IService::initialize()
95 // ============================================================================
98  if ( sc.isFailure() ) return sc;
100  // Set my own properties
101  sc = setProperties();
102 
103  if ( sc.isFailure() ) {
104  error() << "setting my properties" << endmsg;
105  return StatusCode::FAILURE;
106  }
107 
108  // only add an EndEvent listener if per-event output requested
109  if ( !m_perEventFile.empty() ) {
111  if ( !m_ofd.is_open() ) {
112  error() << "unable to open per-event output file \"" << m_perEventFile << "\"" << endmsg;
113  return StatusCode::FAILURE;
114  } else {
115  auto ii = serviceLocator()->service<IIncidentSvc>( "IncidentSvc" );
116  if ( !ii ) {
117  error() << "Unable to find IncidentSvc" << endmsg;
118  return StatusCode::FAILURE;
119  }
120  ii->addListener( this, IncidentType::EndEvent );
121  }
122  }
123 
129  chronoStart( name() );
131  return StatusCode::SUCCESS;
132 }
133 // ============================================================================
134 // Implementation of IService::finalize()
135 // ============================================================================
137  std::string local = name() + ".finalize()";
139  MsgStream main_log( msgSvc(), local );
142  chronoStop( name() );
143 
144  if ( m_ofd.is_open() ) {
145  debug() << "writing per-event timing data to '" << m_perEventFile << "'" << endmsg;
146  for ( const auto& itr : m_perEvtTime ) {
147  m_ofd << itr.first.substr( 0, itr.first.length() - 8 ) << " ";
148  for ( const auto& itt : itr.second ) { m_ofd << " " << (long int)( itt ); }
149  m_ofd << std::endl;
150  }
151 
152  m_ofd.close();
153  }
154 
159  MsgStream log( msgSvc(), "*****Chrono*****" );
160  const std::string stars( ( m_chronoCoutFlag ) ? 126 : 100, '*' );
161  if ( m_chronoCoutFlag ) {
162  std::cout << stars << std::endl;
163  if ( isMT() ) { std::cout << "WARNING: MT job; statistics are unreliable" << std::endl; }
164  std::cout << local << " The Final CPU consumption (Chrono) Table "
165  << ( m_chronoOrderFlag ? "(ordered)" : "(not ordered)" ) << std::endl;
166  std::cout << stars << std::endl;
167  } else {
168  log << m_chronoPrintLevel << stars << endmsg;
169  if ( isMT() ) { log << m_chronoPrintLevel << "WARNING: MT job; statistics are unreliable" << endmsg; }
170  log << m_chronoPrintLevel << " The Final CPU consumption ( Chrono ) Table "
171  << ( m_chronoOrderFlag ? "(ordered)" : "(not ordered)" ) << endmsg;
172  log << m_chronoPrintLevel << stars << endmsg;
173  }
175  { // prepare container for printing
177  tmpCont.reserve( m_chronoEntities.size() );
178  for ( auto& it : m_chronoEntities ) { tmpCont.emplace_back( &it.second, &it.first ); }
179  // sort it
180  if ( m_chronoOrderFlag ) std::sort( tmpCont.begin(), tmpCont.end(), CompareFirstOfPointerPair );
181  // print User Time statistics
182  if ( m_printUserTime ) {
183  for ( auto iter = tmpCont.begin(); tmpCont.end() != iter; ++iter ) {
184  //
185  ChronoEntity* entity = iter->first;
186  if ( !entity ) { continue; }
187  const ChronoTag* tag = iter->second;
188  if ( !tag ) { continue; }
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 << m_chronoPrintLevel << stars << endmsg;
210  }
212  for ( auto iter = tmpCont.begin(); tmpCont.end() != iter; ++iter ) {
214  ChronoEntity* entity = iter->first;
215  if ( !entity ) { continue; }
216  const ChronoTag* tag = iter->second;
217  if ( !tag ) { continue; }
218  entity->stop();
220  if ( m_chronoCoutFlag )
222  {
223  std::cout << *tag << "\t" << entity->outputSystemTime() << std::endl;
224  } else
225  {
226  MsgStream( msgSvc(), *tag ) << m_chronoPrintLevel << entity->outputSystemTime() << endmsg;
227  }
228  //
229  }
230  }
232  if ( m_printEllapsedTime ) {
236  std::cout << stars << std::endl;
237  } else if ( ( m_printUserTime || m_printSystemTime ) && !m_chronoCoutFlag ) {
238  log << m_chronoPrintLevel << stars << endmsg;
239  }
241  for ( const auto& i : tmpCont ) {
243  ChronoEntity* entity = i.first;
244  if ( !entity ) { continue; }
245  const ChronoTag* tag = i.second;
246  if ( !tag ) { continue; }
247  entity->stop();
249  if ( m_chronoCoutFlag )
251  {
252  std::cout << *tag << "\t" << entity->outputElapsedTime() << std::endl;
253  } else
254  {
255  MsgStream( msgSvc(), *tag ) << m_chronoPrintLevel << entity->outputElapsedTime() << endmsg;
256  }
257  //
258  }
259  }
261  tmpCont.clear();
262  }
264  if ( m_chronoCoutFlag ) {
265  std::cout << stars << std::endl;
266  } else {
267  log << m_chronoPrintLevel << stars << endmsg;
268  }
269  }
270 
272 
274  if ( m_statTableFlag ) { printStats(); }
275 
276  if ( !m_statsOutFileName.value().empty() ) { saveStats(); }
277 
278  // clear the maps.
282 
283  main_log << MSG::INFO << " Service finalized successfully " << endmsg;
284 
285  return Service::finalize();
286 }
287 // ============================================================================
288 // Implementation of IChronoStatSvc::chronoStart
289 // ============================================================================
290 ChronoEntity* ChronoStatSvc::chronoStart( const ChronoTag& chronoTag ) {
291  ChronoEntity& entity = getEntity( chronoTag );
292  entity.start();
293  return &entity;
294 }
295 // ============================================================================
296 // Implementation of IChronoStatSvc::chronoStop
297 // ============================================================================
298 const ChronoEntity* ChronoStatSvc::chronoStop( const IChronoStatSvc::ChronoTag& chronoTag ) {
299  ChronoEntity& entity = getEntity( chronoTag );
300  entity.stop();
301  return &entity;
302 }
303 // ============================================================================
304 // Implementation of IChronoStatSvc::chronoDelta
305 // ============================================================================
306 IChronoStatSvc::ChronoTime ChronoStatSvc::chronoDelta( const IChronoStatSvc::ChronoTag& chronoTag,
307  IChronoStatSvc::ChronoType theType ) {
308  return getEntity( chronoTag ).delta( theType );
309 }
310 // ============================================================================
311 // Implementation of IChronoStatSvc::chronoPrint
312 // ============================================================================
313 void ChronoStatSvc::chronoPrint( const IChronoStatSvc::ChronoTag& chronoTag ) {
314  MsgStream log( msgSvc(), chronoTag );
315  if ( m_printUserTime ) { log << m_chronoPrintLevel << getEntity( chronoTag ).outputUserTime() << endmsg; }
316  if ( m_printSystemTime ) { log << m_chronoPrintLevel << getEntity( chronoTag ).outputSystemTime() << endmsg; }
317 }
318 // ============================================================================
319 // Implementation of IChronoSvc::chronoStatus
320 // ============================================================================
321 IChronoStatSvc::ChronoStatus ChronoStatSvc::chronoStatus( const IChronoStatSvc::ChronoTag& chronoTag ) {
322  return getEntity( chronoTag ).status();
323 }
324 // ============================================================================
325 // Implementation of IChronoStatSvc::stat
326 // ============================================================================
327 void ChronoStatSvc::stat( const IChronoStatSvc::StatTag& statTag, const IChronoStatSvc::StatFlag& statFlag ) {
328  auto theIter = m_statEntities.find( statTag );
329 
330  StatEntity* theStat = nullptr;
331  // if new entity, specify the number of events to be skipped
332  if ( theIter == m_statEntities.end() ) {
333  // new stat entity
334  StatEntity& theSe = m_statEntities[statTag];
335  theStat = &theSe;
336  } else {
337  // existing stat entity
338  theStat = &theIter->second;
339  }
340 
341  theStat->addFlag( statFlag );
342 }
343 // ============================================================================
344 // Implementation of IChronoStatSvc::statPrint
345 // ============================================================================
346 void ChronoStatSvc::statPrint( const IChronoStatSvc::StatTag& statTag ) {
347  MsgStream log( msgSvc(), statTag );
348  log << m_statPrintLevel << m_statEntities[statTag] << endmsg;
349 }
350 // ============================================================================
351 /* extract the chrono entity for the given tag (name)
352  * @see IChronoStatSvc
353  * @param t chrono tag(name)
354  * @return pointer to chrono entity
355  */
356 // ============================================================================
357 const ChronoEntity* ChronoStatSvc::chrono( const IChronoStatSvc::ChronoTag& t ) const {
358  lock_t lock( m_mutex );
359  auto it = m_chronoEntities.find( t );
360  return m_chronoEntities.end() != it ? &( it->second ) : nullptr;
361 }
362 // ============================================================================
363 /* extract the stat entity for the given tag (name)
364  * @see IChronoStatSvc
365  * @param t stat tag(name)
366  * @return pointer to stat entity
367  */
368 // ============================================================================
369 StatEntity* ChronoStatSvc::stat( const IChronoStatSvc::StatTag& t ) {
370  auto it = m_statEntities.find( t );
371  return m_statEntities.end() != it ? &( it->second ) : nullptr;
372 }
373 // ============================================================================
374 // dump all the statistics into an ASCII file
375 // ============================================================================
377  std::ofstream out( m_statsOutFileName.value(), std::ios_base::out | std::ios_base::trunc );
378  if ( !out.good() ) {
379  info() << "Could not open the output file for writing chrono statistics [" << m_statsOutFileName.value() << "]"
380  << endmsg;
381  return;
382  } else {
383  // format it our way
384  out << std::scientific << std::setprecision( 8 );
385  }
386 
387  // ChronoEntity
389  {
390  lock_t lock( m_mutex );
391  chronos.reserve( m_chronoEntities.size() );
393  []( ChronoMap::const_reference i ) { return std::make_pair( &i.second, &i.first ); } );
394  }
395 
396  // sort it
397  std::sort( std::begin( chronos ), std::end( chronos ), CompareFirstOfPointerPair );
398 
399  // print User Time statistics
400  for ( const auto& iter : chronos ) {
401  //
402  const ChronoEntity* entity = iter.first;
403  if ( !entity ) { continue; }
404 
405  const ChronoTag* tag = iter.second;
406  if ( !tag ) { continue; }
407 
408  // create an entry in the .INI-like table
409  out << "\n[" << *tag << "]\n";
410 
411  // user
412  out << "cpu_user_total = " << entity->uTotalTime() << "\n";
413  out << "cpu_user_min = " << entity->uMinimalTime() << "\n";
414  out << "cpu_user_mean = " << entity->uMeanTime() << "\n";
415  out << "cpu_user_RMS = " << entity->uRMSTime() << "\n";
416  out << "cpu_user_max = " << entity->uMaximalTime() << "\n";
417  out << "cpu_user_nbr = " << entity->nOfMeasurements() << "\n";
418 
419  // system
420  out << "\n"; // just for clarity
421  out << "cpu_system_total = " << entity->kTotalTime() << "\n";
422  out << "cpu_system_min = " << entity->kMinimalTime() << "\n";
423  out << "cpu_system_mean = " << entity->kMeanTime() << "\n";
424  out << "cpu_system_RMS = " << entity->kRMSTime() << "\n";
425  out << "cpu_system_max = " << entity->kMaximalTime() << "\n";
426  out << "cpu_system_nbr = " << entity->nOfMeasurements() << "\n";
427 
428  // real
429  out << "\n"; // just for clarity
430  out << "cpu_real_total = " << entity->eTotalTime() << "\n";
431  out << "cpu_real_min = " << entity->eMinimalTime() << "\n";
432  out << "cpu_real_mean = " << entity->eMeanTime() << "\n";
433  out << "cpu_real_RMS = " << entity->eRMSTime() << "\n";
434  out << "cpu_real_max = " << entity->eMaximalTime() << "\n";
435  out << "cpu_real_nbr = " << entity->nOfMeasurements() << "\n";
436  }
437 
438  out << std::endl;
439 }
440 // ============================================================================
441 // Test if we're running in an MT job.
442 // ============================================================================
443 bool ChronoStatSvc::isMT() const {
444  bool isMT = false;
446  error() << "Cannot retrieve HiveWhiteBoardSvc";
447  } else {
448  // In non-MT mode, `EventDataSvc' does not have an IHiveWhiteBoard interface.
450  if ( wb && wb->getNumberOfStores() > 1 ) { isMT = true; }
451  }
452  return isMT;
453 }
454 // ============================================================================
455 // print the "Stat" part of the ChronoStatSvc
456 // ============================================================================
459  if ( m_statEntities.empty() ) { return; }
460 
461  MsgStream log( msgSvc(), "******Stat******" );
463  const std::string stars( ( m_statCoutFlag ) ? 126 : 100, '*' );
465  if ( m_statCoutFlag ) {
466  std::cout << stars << std::endl;
467  if ( isMT() ) { std::cout << "WARNING: MT job; statistics are unreliable" << std::endl; }
468  std::cout << " The Final stat Table " << ( m_statOrderFlag ? "(ordered)" : "(not ordered)" ) << std::endl;
469  std::cout << stars << std::endl;
470  } else {
471  log << m_statPrintLevel << stars << endmsg;
472  if ( isMT() ) { log << (MSG::Level)m_chronoPrintLevel << "WARNING: MT job; statistics are unreliable" << endmsg; }
473  log << m_statPrintLevel << " The Final stat Table " << ( m_statOrderFlag ? "(ordered)" : "(not ordered)" )
474  << endmsg;
475  log << m_statPrintLevel << stars << endmsg;
476  }
477 
478  {
479  // prepare container for printing
481  typedef std::vector<SPair> SCont;
482  SCont tmpCont;
484  []( StatMap::const_reference i ) { return std::make_pair( &i.second, &i.first ); } );
485  // sort it
486  if ( m_statOrderFlag ) std::sort( tmpCont.begin(), tmpCont.end(), CompareFirstOfPointerPair );
487  // print the table header
488  if ( m_statCoutFlag ) {
489  std::cout << m_header.value() << std::endl;
490  } else {
491  log << m_statPrintLevel << m_header.value() << endmsg;
492  }
493 
494  // loop over counters and print them:
495  for ( const auto& iter : tmpCont ) {
497  const StatEntity* entity = iter.first;
498  if ( !entity ) { continue; }
499  const StatTag* tag = iter.second;
500  if ( !tag ) { continue; }
501  if ( m_statCoutFlag ) {
503  entity->print( std::cout, true, *tag, m_useEffFormat, "%|-15.15s|%|17t|" );
504  } else {
505  std::ostringstream ost;
506  entity->print( ost, true, *tag, m_useEffFormat, "%|-15.15s|%|17t|" );
507  log << m_statPrintLevel << ost.str() << endmsg;
508  }
509  }
510  tmpCont.clear();
511  }
513  if ( m_statCoutFlag ) {
514  std::cout << stars << std::endl;
515  } else {
516  log << m_statPrintLevel << stars << endmsg;
517  }
518 }
519 
520 // ============================================================================
521 
522 void ChronoStatSvc::handle( const Incident& /* inc */ ) {
523 
524  if ( !m_ofd.is_open() ) return;
525 
526  lock_t lock( m_mutex );
527  for ( const auto& itr : m_chronoEntities ) {
528  if ( itr.first.find( ":Execute" ) == std::string::npos ) continue;
529 
530  auto itm = m_perEvtTime.find( itr.first );
531  if ( itm == m_perEvtTime.end() ) {
532  m_perEvtTime[itr.first] = {itr.second.delta( IChronoSvc::ELAPSED )};
533  } else {
534  itm->second.push_back( itr.second.delta( IChronoSvc::ELAPSED ) );
535  }
536  }
537 }
538 
539 // ============================================================================
540 // The END
541 // ============================================================================
ChronoEntity & getEntity(const ChronoTag &chronoTag)
Definition of the MsgStream class used to transmit messages.
Definition: MsgStream.h:34
StatusCode initialize() override
Definition: Service.cpp:70
SmartIF< ISvcLocator > & serviceLocator() const override
Retrieve pointer to service locator.
Definition: Service.cpp:287
T empty(T... args)
T open(T... args)
double eRMSTime() const
r.m.s Elapsed Time
Definition: ChronoEntity.h:255
const SmartIF< IMessageSvc > & msgSvc() const
The standard message service.
ChronoStatus chronoStatus(const IChronoStatSvc::ChronoTag &chronoTag) override
Implementation of IChronoStatSvc::chronoStatus.
Gaudi::Property< std::string > m_header
StatusCode finalize() override
Definition: Service.cpp:174
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:31
IChronoSvc::ChronoTime delta(IChronoSvc::ChronoType type) const
return the last delta-time of type "type"
Definition: ChronoEntity.h:271
Gaudi::Property< bool > m_statCoutFlag
IChronoStatSvc::ChronoTime chronoDelta(const IChronoStatSvc::ChronoTag &chronoTag, IChronoStatSvc::ChronoType theType) override
Implementation of IchronoStatSvc::chronoDelta.
T endl(T... args)
Gaudi::Property< bool > m_chronoOrderFlag
constexpr static const auto SUCCESS
Definition: StatusCode.h:96
Gaudi::Property< bool > m_printUserTime
std::mutex m_mutex
Mutex protecting m_chronoEntities.
void stat(const IChronoStatSvc::StatTag &statTag, const IChronoStatSvc::StatFlag &statFlag) override
Implementation of IChronoStatSvc::stat add statistical information to the entity ,...
double uMinimalTime() const
minimal measurement for user time
Definition: ChronoEntity.h:195
T end(T... args)
MsgStream & info() const
shortcut for the method msgStream(MSG::INFO)
void statPrint(const IChronoStatSvc::ChronoTag &statTag) override
prints (using message service) info about statistical entity, tagged by its name
IChronoSvc::ChronoStatus start()
start the current chrono
STL class.
#define DECLARE_COMPONENT(type)
double kRMSTime() const
r.m.s Kernel Time
Definition: ChronoEntity.h:247
StatusCode service(const Gaudi::Utils::TypeNameString &name, T *&svc, bool createIf=true)
Templated method to access a service by name.
Definition: ISvcLocator.h:86
const std::string & name() const override
Retrieve name of the service.
Definition: Service.cpp:284
STL class.
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
double eMaximalTime() const
maximal measurement for elapsed time
Definition: ChronoEntity.h:215
void merge(const ChronoStatSvc &css)
Compound assignment operator.
double uTotalTime() const
total user time
Definition: ChronoEntity.h:219
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:61
unsigned long nOfMeasurements() const
number of chrono measurements
Definition: ChronoEntity.h:191
double eMinimalTime() const
minimal measurement for elapsed time
Definition: ChronoEntity.h:203
void clear(STATE_TYPE _i=std::ios_base::failbit)
Definition: MsgStream.h:181
TimeMap m_perEvtTime
T close(T... args)
const ChronoEntity * chronoStop(const IChronoStatSvc::ChronoTag &chronoTag) override
Implementation of IChronoStatSvc::chronoStop.
StatusCode retrieve() const
Retrieve the Service.
Definition: ServiceHandle.h:80
double uMeanTime() const
average User Time
Definition: ChronoEntity.h:239
Gaudi::Property< bool > m_statOrderFlag
double kMeanTime() const
average Kernel Time
Definition: ChronoEntity.h:235
T str(T... args)
T make_pair(T... args)
MsgStream & debug() const
shortcut for the method msgStream(MSG::DEBUG)
Gaudi::Property< bool > m_chronoTableFlag
double eTotalTime() const
total Elapsed time
Definition: ChronoEntity.h:227
T clear(T... args)
ServiceHandle< IInterface > m_hiveWhiteBoardSvc
std::ofstream m_ofd
StatusCode setProperties()
Method for setting declared properties to the values specified for the job.
Definition: Service.cpp:290
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
std::ostream & print(std::ostream &o, bool tableFormat, const std::string &name, bool flag=true, std::string fmtHead="%|-48.48s|%|27t|") const
Definition: StatEntity.h:159
T * get() const
Release the Service.
Definition: ServiceHandle.h:91
T insert(T... args)
T find(T... args)
T size(T... args)
HepRndm::Engine< TripleRand > e2
STL class.
double kTotalTime() const
total Kernel time
Definition: ChronoEntity.h:223
T begin(T... args)
void handle(const Incident &incident) override
T back_inserter(T... args)
Gaudi::Property< bool > m_statTableFlag
Base class for all Incidents (computing events).
Definition: Incident.h:27
ChronoEntity * chronoStart(const IChronoStatSvc::ChronoTag &chronoTag) override
Implementation of IChronoStatSvc::chronoStart.
unsigned long addFlag(const double v)
Definition: StatEntity.h:85
double uMaximalTime() const
maximal measurement for user time
Definition: ChronoEntity.h:207
double kMinimalTime() const
minimal measurement for kernel time
Definition: ChronoEntity.h:199
T emplace(T... args)
bool isMT() const
constexpr static const auto FAILURE
Definition: StatusCode.h:97
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)
bool isFailure() const
Definition: StatusCode.h:141
double eMeanTime() const
average Elapsed Time
Definition: ChronoEntity.h:243
bool operator()(const std::pair< S *, T * > &p1, const std::pair< S *, T * > &p2) const
backward compatible StatEntity class.
Definition: StatEntity.h:18
T is_open(T... args)
IChronoSvc::ChronoStatus stop()
stop the chrono
T setprecision(T... args)
double kMaximalTime() const
maximal measurement for kernel time
Definition: ChronoEntity.h:211
IChronoSvc::ChronoStatus status() const
return the status of chrono
Definition: ChronoEntity.h:187
std::string outputElapsedTime() const
print the chrono ;
double uRMSTime() const
r.m.s User Time
Definition: ChronoEntity.h:251
void chronoPrint(const IChronoStatSvc::ChronoTag &chronoTag) override
Implementation of IChronoStatSvc::chronoPrint.
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:202
The interface implemented by the IncidentSvc service.
Definition: IIncidentSvc.h:33
std::string outputUserTime() const
print the chrono ;
The Chrono & Stat Sservice: service implements the IChronoStatSvc interface and provides the basic ch...
Definition: ChronoStatSvc.h:46
std::string outputSystemTime() const
print the chrono ;
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
const ChronoEntity * chrono(const IChronoStatSvc::ChronoTag &t) const override
extract the chrono entity for the given tag (name)