Hall A ROOT/C++ Analyzer (podd)
Loading...
Searching...
No Matches
THaBenchmark.h
Go to the documentation of this file.
1#ifndef Podd_THaBenchmark_h_
2#define Podd_THaBenchmark_h_
3
4//_____________________________________________________________________________
5//
6// THaBenchmark utility class
7//
8// Provides start/stop mode for ROOT's TBenchmark class
9//_____________________________________________________________________________
10
11#include "TBenchmark.h"
12#include "TMath.h"
13#include <iostream>
14#include <iomanip>
15#include <cstring>
16#include <vector>
17
18//_____________________________________________________________________________
19class THaBenchmark : public TBenchmark {
20public:
21 THaBenchmark() { fNmax = 50; }
22 virtual ~THaBenchmark() = default;
23
24 virtual void Begin(const char *name) {
25 if (!fNbench)
27 else {
28 Int_t bench = GetBench(name);
29 if (bench < 0 && fNbench < fNmax )
31 else if (bench>=0)
32 fTimer[bench].Start(false);
33 else
34 Warning("Start","too many benches");
35 }
36 }
37
38 void PrintByName(const std::vector<TString>& names) const {
39 int width = 10;
40 for( const auto& name : names )
41 width = TMath::Max(width, name.Length());
42 for( const auto& name : names )
43 PrintBenchmark(name.Data(), width);
44 }
45
46 virtual void Print(Option_t *name="") const {
47 if( name && name[0] != '\0' )
49 else {
50 std::vector<TString> names{ fNames, fNames + fNbench };
51 PrintByName(names);
52 }
53 }
54
55private:
56 void PrintBenchmark( const char* name, int width = 10 ) const {
57 auto fmt = std::cout.flags();
58 auto prec = std::cout.precision();
59 Int_t bench = GetBench(name);
60 if (bench < 0) return;
61 std::cout << std::left << std::setw(width) << name << ": " << std::right
62 << "Real Time = "
63 << std::fixed << std::setw(6) << std::setprecision(2)
64 << fRealTime[bench] << " seconds "
65 << "Cpu Time = "
66 << std::fixed << std::setw(6) << std::setprecision(2)
67 << fCpuTime[bench] << " seconds" << std::endl;
68 std::cout.flags(fmt);
69 std::cout.precision(prec);
70 }
71 ClassDef(THaBenchmark,0) // TBenchmark with true start/stop mode
72};
73
74#endif
int Int_t
const char Option_t
#define ClassDef(name, id)
Option_t Option_t width
char name[80]
TStopwatch * fTimer
Int_t fNbench
Int_t GetBench(const char *name) const
virtual void Start(const char *name)
Float_t * fCpuTime
TString * fNames
Float_t * fRealTime
virtual void Begin(const char *name)
void PrintByName(const std::vector< TString > &names) const
void PrintBenchmark(const char *name, int width=10) const
virtual ~THaBenchmark()=default
virtual void Print(Option_t *name="") const
virtual void Warning(const char *method, const char *msgfmt,...) const
void Start(Bool_t reset=kTRUE)
Double_t Max(Double_t a, Double_t b)