52#define INT_MAX std::numeric_limits<int>::max()
60 fValue(nullptr), fDim(dim), fBins(bins), fNum(num),
61 fSparse(nullptr), fHist(nullptr),
fHn(nullptr) {}
65 if (time == kReal)
return fTime[hist][0];
66 return fTime[hist][1]; }
71 void Fill(
EHist hist);
89Int_t TTimeHists::fgDebug = 0;
91TTimeHists::~TTimeHists()
105 for (
int h = 0;
h < 2; ++
h) {
119 }
while ((!
h &&
w.RealTime() < 0.1)
122 fTime[
h][0] = (1.* fNum *
rep[
h]) /
w.RealTime() / 1
E6;
123 fTime[
h][1] = (1.* fNum *
rep[
h]) /
w.CpuTime() / 1
E6;
125 if (
h == 1 && (fTime[
h][0] > 1
E20 || fTime[
h][1] > 1
E20)) {
133 }
while (
w.RealTime() < 0.1);
135 fTime[
h][0] = (1.* fNum *
rep[
h]) /
w.RealTime() / 1
E6;
136 fTime[
h][1] = (1.* fNum *
rep[
h]) /
w.CpuTime() / 1
E6;
139 if (fTime[
h][0] > 1
E20) fTime[
h][0] = 1
E20;
140 if (fTime[
h][1] > 1
E20) fTime[
h][1] = 1
E20;
142 catch (std::exception&) {
143 fTime[
h][0] = fTime[
h][1] = -1.;
150 printf(
"ERROR: mismatch of histogram (%g) and sparse histogram (%g) for dim=%d, bins=%d!\n",
158void TTimeHists::NextValues()
164void TTimeHists::SetupValues()
167 if (!fValue) fValue =
new Double_t[fDim];
171void TTimeHists::Fill(
EHist hist)
176 printf(
"%ld: fill %s",
n, hist ==
kHist? (fDim < 4 ?
"hist" :
"arr") :
"sparse");
183 case 1: fHist->Fill(fValue[0]);
break;
184 case 2: ((
TH2F*)fHist)->Fill(fValue[0], fValue[1]);
break;
185 case 3: ((
TH3F*)fHist)->Fill(fValue[0], fValue[1], fValue[2]);
break;
186 default:
fHn->Fill(fValue);
break;
194void TTimeHists::SetupHist(
EHist hist)
198 case 1: fHist =
new TH1F(
"h1",
"h1", fBins, -1., 1.);
break;
199 case 2: fHist =
new TH2F(
"h2",
"h2", fBins, -1., 1., fBins, -1., 1.);
break;
200 case 3: fHist =
new TH3F(
"h3",
"h3", fBins, -1., 1., fBins, -1., 1., fBins, -1., 1.);
break;
210 throw std::bad_alloc();
215 throw std::bad_alloc();
252 while (
x[0] <= fBins + 1) {
256 if (fDim == 2)
histidx = fHist->GetBin(
x[0],
x[1]);
257 else if (fDim == 3)
histidx = fHist->GetBin(
x[0],
x[1],
x[2]);
260 else v =
fHn->GetBinContent(
x);
267 if (fgDebug > 2 || (fgDebug > 1 &&
v)) {
268 printf(
"%s%d", fDim < 4 ?
"hist" :
"arr", fDim);
277 for (
Int_t d = fDim - 1;
d > 0; --
d) {
278 if (
x[
d] > fBins + 1) {
303 printf(
"check %s%d = %g\n", hist ==
kHist ? (fDim < 4 ?
"hist" :
"arr") :
"sparse", fDim,
check);
311#if defined (__CLING__)
312 printf(
"Please run this script in compiled mode by running \".x sparsehist.C+\"\n");
316 TH2F*
htime[TTimeHists::kNumHist][TTimeHists::kNumTime];
317 for (
int h = 0;
h < TTimeHists::kNumHist; ++
h)
318 for (
int t = 0; t < TTimeHists::kNumTime; ++t) {
320 if (
h == 0)
name +=
"arr";
322 if (t == 0)
name +=
"_r";
325 title.
Form(
"Throughput (fill,get) %s (%s, 1M entries/sec);dim;bins;1M entries/sec",
h == 0 ?
"TH1/2/3/nF" :
"THnSparseF", t == 0 ?
"real" :
"CPU");
329 TH2F*
hsparse_mem =
new TH2F(
"hsparse_mem",
"Fractional memory usage;dim;bins;fraction of memory used", 6, 0.5, 6.5, 10, 5, 105);
330 TH2F*
hsparse_bins =
new TH2F(
"hsparse_bins",
"Fractional number of used bins;dim;bins;fraction of filled bins", 6, 0.5, 6.5, 10, 5, 105);
334 for (
Int_t dim = 1; dim < 7; ++dim) {
335 printf(
"Processing dimension %d", dim);
336 for (
Int_t bins = 10; bins <= 100; bins += 10) {
339 for (
int h = 0;
h < TTimeHists::kNumHist; ++
h) {
340 for (
int t = 0; t < TTimeHists::kNumTime; ++t) {
341 Double_t time =
timer.GetTime((TTimeHists::EHist)
h, (TTimeHists::ETime)t);
343 htime[
h][t]->Fill(dim, bins, time);
349 if (max <
timer.GetTime(TTimeHists::kSparse, TTimeHists::kReal))
350 max =
timer.GetTime(TTimeHists::kSparse, TTimeHists::kReal);
362 for (
int t = 0; t < TTimeHists::kNumTime; ++t) {
363 const char*
name = t ?
"htime_ratio" :
"htime_ratio_r";
366 title.
Form(
"Relative speed improvement (%s, 1M entries/sec): sparse/hist;dim;bins;#Delta 1M entries/sec", t == 0 ?
"real" :
"CPU");
373 TFile*
f =
new TFile(
"sparsehist.root",
"RECREATE");
381 const char* opt =
"TEXT COL";
383 for (
int t = 0; t < TTimeHists::kNumTime; ++t) {
384 for (
int h = 0;
h < TTimeHists::kNumHist; ++
h) {
385 htime[
h][t]->SetMaximum(max);
387 canv->cd(1 +
h + 3 * t);
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
THnSparseT< TArrayF > THnSparseF
R__EXTERN TRandom * gRandom
R__EXTERN TStyle * gStyle
R__EXTERN TSystem * gSystem
A ROOT file is an on-disk file, usually with extension .root, that stores objects in a file-system-li...
1-D histogram with a float per channel (see TH1 documentation)
TH1 is the base class of all histogram classes in ROOT.
2-D histogram with a float per channel (see TH1 documentation)
3-D histogram with a float per channel (see TH1 documentation)
Efficient multidimensional histogram.
Multidimensional histogram.
virtual Double_t Gaus(Double_t mean=0, Double_t sigma=1)
Samples a random number from the standard Normal (Gaussian) Distribution with the given mean and sigm...
virtual void SetSeed(ULong_t seed=0)
Set the random generator seed.
void Form(const char *fmt,...)
Formats a string using a printf style format descriptor.
void SetOptStat(Int_t stat=1)
The type of information printed in the histogram statistics box can be selected via the parameter mod...
void SetPaintTextFormat(const char *format="g")
void SetPalette(Int_t ncolors=kBird, Int_t *colors=nullptr, Float_t alpha=1.)
See TColor::SetPalette.
virtual int GetMemInfo(MemInfo_t *info) const
Returns ram and swap memory usage info into the MemInfo_t structure.