25 using TimePoint_t = decltype( std::chrono::high_resolution_clock::now() );
31 Timer(
const char *title,
size_t count) : fTitle(title), fCount(count),
32 fStart(
std::chrono::high_resolution_clock::now()) {}
35 using namespace std::chrono;
36 auto end = high_resolution_clock::now();
37 duration<double> time_span = duration_cast<duration<double>>(end - fStart);
40 std::cout << fCount <<
" * " << fTitle <<
": " << time_span.count() <<
" seconds, \t";
41 std::cout << fCount / (1e6) / time_span.count() <<
" millions per seconds \n";
49 static constexpr
size_t fNBinsX = 4;
50 static constexpr
size_t fNBinsY = 5;
54 BinEdges(
double minValue,
double maxValue) {
55 if (maxValue < minValue)
swap(minValue,maxValue);
56 double range = maxValue - minValue;
58 double x[fNBinsX] = {0., 0.1, 0.3, 1.};
59 double y[fNBinsY] = {0., 0.1, 0.2, 0.3, 1.};
61 for(
size_t i = 0; i < fNBinsX; ++i)
62 fXBins[i] = minValue + range * x[i];
63 for(
size_t i = 0; i < fNBinsY; ++i)
64 fYBins[i] = minValue + range * y[i];
70 AConf_t GetConfigX()
const {
return AConf_t(std::array_view<double>(fXBins).to_vector()); }
71 AConf_t GetConfigY()
const {
return AConf_t(std::array_view<double>(fYBins).to_vector()); }
78 Timer t(
"GenerateInput",numbers.size());
79 if (minVal > maxVal) {
82 T range = maxVal - minVal;
84 size_t len = numbers.size();
85 for(
auto c = numbers.begin(); c != numbers.end(); ++c) {
86 *c = minVal + range *
r.
Rndm();
90 std::string
MakeTitle(std::string_view version,
91 std::string_view histname,
92 std::string_view title,
93 std::string_view axis)
95 std::string
result = std::string(version) +
" " + std::string(histname) +
" " + title.to_string() +
" [" + axis.to_string() +
"]";
99 template <
int dim,
typename type>
const char *
GetHist();
111 template <
typename T,
unsigned short kNDim>
struct Dim;
113 template <
typename T>
116 constexpr
static unsigned short kNDim = 2;
120 using InputType_t = double;
122 using FillFunc_t = std::add_pointer_t<long(ExpTH2 &hist, std::vector<InputType_t> &input, std::string_view
type)>;
126 static constexpr
const char *
const gType =
"regular bin size ";
128 template <FillFunc_t filler>
129 static long Execute(std::vector<InputType_t> &input,
double minVal,
double maxVal) {
131 ExpTH2 hist({100, minVal, maxVal}, {5, minVal, maxVal});
132 return filler(hist,input,gType);
137 static constexpr
const char *
const gType =
"irregular bin size";
139 template <FillFunc_t filler>
140 static long Execute(std::vector<InputType_t> &input,
double minVal,
double maxVal) {
142 BinEdges edges(minVal,maxVal);
143 ExpTH2 hist( edges.GetConfigX(), edges.GetConfigY() );
144 return filler(hist,input,gType);
148 inline static long fillN(ExpTH2 &hist, std::vector<InputType_t> &input, std::string_view gType) {
151 using array_t = std::array<InputType_t, 2>;
152 array_t *values = (array_t*)(&input[0]);
153 constexpr
size_t stride =
gStride;
155 std::string title =
MakeTitle(gVersion, GetHist<kNDim, T>(),
"fills N (stride 32)", gType);
157 Timer t(title.c_str(),input.size()/2);
158 for (
size_t i = 0; i < (input.size()-(stride*2-1)); i += (stride*2), values += 32)
159 hist.FillN({values,32});
161 return hist.GetNDim();
165 inline static long fillBuffered(ExpTH2 &hist, std::vector<InputType_t> &input, std::string_view gType) {
167 std::string title =
MakeTitle(gVersion, GetHist<kNDim, T>(),
"fills (buffered) ", gType);
169 Timer t(title.c_str(),input.size()/2);
170 for (
size_t i = 0; i < input.size()-1; i += 2)
171 filler.Fill({input[i], input[i+1]});
173 return hist.GetNDim();
176 inline static long fill(ExpTH2 &hist, std::vector<InputType_t> &input, std::string_view gType) {
177 std::string title =
MakeTitle(gVersion, GetHist<kNDim, T>(),
"fills ", gType);
179 Timer t(title.c_str(),input.size()/2);
180 for (
size_t i = 0; i < input.size()-1; i += 2)
181 hist.Fill({input[i], input[i+1]});
183 return hist.GetNDim();
188 template <
typename T>
191 constexpr
static unsigned short kNDim = 1;
195 using InputType_t = double;
197 using FillFunc_t = std::add_pointer_t<long(ExpTH1 &hist, std::vector<InputType_t> &input, std::string_view
type)>;
201 static constexpr
const char *
const gType =
"regular bin size ";
203 template <FillFunc_t filler>
204 static long Execute(std::vector<InputType_t> &input,
double minVal,
double maxVal) {
206 ExpTH1 hist({100, minVal, maxVal});
207 return filler(hist,input,gType);
212 static constexpr
const char *
const gType =
"irregular bin size";
214 template <FillFunc_t filler>
215 static long Execute(std::vector<InputType_t> &input,
double minVal,
double maxVal) {
217 BinEdges edges(minVal,maxVal);
218 ExpTH1 hist( edges.GetConfigX() );
219 return filler(hist,input,gType);
223 inline static long fillN(ExpTH1 &hist, std::vector<InputType_t> &input, std::string_view gType) {
226 using array_t = std::array<InputType_t, 1>;
227 array_t *values = (array_t*)(&input[0]);
228 constexpr
size_t stride =
gStride;
230 std::string title =
MakeTitle(gVersion, GetHist<kNDim, T>(),
"fills N (stride 32)", gType);
232 Timer t(title.c_str(),input.size());
233 for (
size_t i = 0; i < (input.size()-(stride-1)); i += (stride), values += 32)
234 hist.FillN({values,32});
236 return hist.GetNDim();
240 inline static long fillBuffered(ExpTH1 &hist, std::vector<InputType_t> &input, std::string_view gType) {
242 std::string title =
MakeTitle(gVersion, GetHist<kNDim, T>(),
"fills (buffered) ", gType);
244 Timer t(title.c_str(),input.size());
245 for (
size_t i = 0; i < input.size(); ++i)
246 filler.Fill({input[i]});
248 return hist.GetNDim();
251 inline static long fill(ExpTH1 &hist, std::vector<InputType_t> &input, std::string_view gType) {
252 std::string title =
MakeTitle(gVersion, GetHist<kNDim, T>(),
"fills ", gType);
254 Timer t(title.c_str(),input.size());
255 for (
size_t i = 0; i < input.size(); ++i)
256 hist.Fill({input[i]});
258 return hist.GetNDim();
270 const char *gVersion =
"R6";
272 template <
int ndim,
typename T>
struct Redirect;
273 template <>
struct Redirect<2,float> {
using HistType_t =
TH2F; };
274 template <>
struct Redirect<2,double> {
using HistType_t =
TH2D; };
275 template <>
struct Redirect<1,float> {
using HistType_t =
TH1F; };
276 template <>
struct Redirect<1,double> {
using HistType_t =
TH1D; };
278 template <
typename T,
int kNDim>
struct Dim;
280 template <
typename T>
283 constexpr
static unsigned short kNDim = 2;
284 using HistType_t =
typename Redirect<kNDim,T>::HistType_t;
287 using InputType_t = double;
289 using FillFunc_t = std::add_pointer_t<long(HistType_t &hist, std::vector<InputType_t> &input, std::string_view
type)>;
294 static constexpr
const char *
const gType =
"regular bin size ";
296 template <FillFunc_t filler>
297 static long Execute(std::vector<InputType_t> &input,
double minVal,
double maxVal) {
299 HistType_t hist(
"a",
"a hist", 100, minVal, maxVal, 5, minVal, maxVal);
300 return filler(hist,input,gType);
306 static constexpr
const char *
const gType =
"irregular bin size";
308 template <FillFunc_t filler>
309 static long Execute(std::vector<InputType_t> &input,
double minVal,
double maxVal) {
311 BinEdges edges(minVal,maxVal);
312 HistType_t hist(
"a",
"a hist", edges.fNBinsX - 1, edges.fXBins, edges.fNBinsY - 1, edges.fYBins);
313 return filler(hist,input,gType);
318 static long fillBuffered(HistType_t &hist, std::vector<InputType_t> &input, std::string_view gType) {
319 std::string title =
MakeTitle(gVersion, GetHist<kNDim,T>(),
"fills (buffered) ", gType);
323 Timer t(title.c_str(),input.size()/2);
324 for (
size_t i = 0; i < input.size()-1; i += 2)
325 hist.Fill(input[i], input[i+1]);
327 return (
long)hist.GetEntries();
331 static long fillN(HistType_t &hist, std::vector<InputType_t> &input, std::string_view gType) {
332 std::string title =
MakeTitle(gVersion, GetHist<kNDim,T>(),
"fills N (stride 32)", gType);
333 constexpr
size_t stride =
gStride;
336 Timer t(title.c_str(),input.size()/2);
337 for (
size_t i = 0; i < (input.size()-(stride*2-1)); i += (stride*2))
338 hist.FillN(gStride, &(input[i]), &(input[i+gStride]),
nullptr);
340 return (
long)hist.GetEntries();
343 static long fill(HistType_t &hist, std::vector<InputType_t> &input, std::string_view gType) {
344 std::string title =
MakeTitle(gVersion, GetHist<kNDim,T>(),
"fills ", gType);
347 Timer t(title.c_str(),input.size()/2);
348 for (
size_t i = 0; i < input.size()-1; i += 2)
349 hist.Fill(input[i], input[i+1]);
351 return (
long)hist.GetEntries();
355 template <
typename T>
358 constexpr
static unsigned short kNDim = 1;
359 using HistType_t =
typename Redirect<kNDim,T>::HistType_t;
362 using InputType_t = double;
364 using FillFunc_t = std::add_pointer_t<long(HistType_t &hist, std::vector<InputType_t> &input, std::string_view
type)>;
369 static constexpr
const char *
const gType =
"regular bin size ";
371 template <FillFunc_t filler>
372 static long Execute(std::vector<InputType_t> &input,
double minVal,
double maxVal) {
374 HistType_t hist(
"a",
"a hist", 100, minVal, maxVal);
375 return filler(hist,input,gType);
381 static constexpr
const char *
const gType =
"irregular bin size";
383 template <FillFunc_t filler>
384 static long Execute(std::vector<InputType_t> &input,
double minVal,
double maxVal) {
386 BinEdges edges(minVal,maxVal);
387 HistType_t hist(
"a",
"a hist", edges.fNBinsX - 1, edges.fXBins);
388 return filler(hist,input,gType);
393 static long fillBuffered(HistType_t &hist, std::vector<InputType_t> &input, std::string_view gType) {
394 std::string title =
MakeTitle(gVersion, GetHist<kNDim,T>(),
"fills (buffered) ", gType);
398 Timer t(title.c_str(),input.size());
399 for (
size_t i = 0; i < input.size()-1; ++i)
402 return (
long)hist.GetEntries();
406 static long fillN(HistType_t &hist, std::vector<InputType_t> &input, std::string_view gType) {
407 std::string title =
MakeTitle(gVersion, GetHist<kNDim,T>(),
"fills N (stride 32)", gType);
408 constexpr
size_t stride =
gStride;
411 Timer t(title.c_str(),input.size());
412 for (
size_t i = 0; i < (input.size()-(stride-1)); i += (stride))
413 hist.FillN(gStride, &(input[i]),
nullptr);
415 return (
long)hist.GetEntries();
418 static long fill(HistType_t &hist, std::vector<InputType_t> &input, std::string_view gType) {
419 std::string title =
MakeTitle(gVersion, GetHist<kNDim,T>(),
"fills ", gType);
422 Timer t(title.c_str(),input.size());
423 for (
size_t i = 0; i < input.size(); ++i)
426 return (
long)hist.GetEntries();
431 template <
typename T,
unsigned short kNDim>
432 void speedtest(
size_t count = (
size_t)(1e6));
436 using DataType_t = double;
437 using InputType_t = double;
438 static constexpr
unsigned short kNDim = 2;
442 std::vector<InputType_t> input;
445 double minVal = -5.0;
446 double maxVal = +5.0;
455 R7::Dim<DataType_t,kNDim>::EE::Execute<R7::Dim<DataType_t,kNDim>::fillBuffered >(input, minVal, maxVal);
456 R7::Dim<DataType_t,kNDim>::EE::Execute<R7::Dim<DataType_t,kNDim>::fillBuffered >(input, minVal, maxVal);
457 R7::Dim<DataType_t,kNDim>::EE::Execute<R7::Dim<DataType_t,kNDim>::fillN>(input, minVal, maxVal);
458 R7::Dim<DataType_t,kNDim>::EE::Execute<R7::Dim<DataType_t,kNDim>::fillN>(input, minVal, maxVal);
464 R7::Dim<DataType_t,kNDim>::II::Execute<R7::Dim<DataType_t,kNDim>::fillBuffered>(input, minVal, maxVal);
465 R7::Dim<DataType_t,kNDim>::II::Execute<R7::Dim<DataType_t,kNDim>::fillBuffered>(input, minVal, maxVal);
466 R7::Dim<DataType_t,kNDim>::II::Execute<R7::Dim<DataType_t,kNDim>::fillN>(input, minVal, maxVal);
467 R7::Dim<DataType_t,kNDim>::II::Execute<R7::Dim<DataType_t,kNDim>::fillN>(input, minVal, maxVal);
473 R6::Dim<DataType_t,kNDim>::EE::Execute<R6::Dim<DataType_t,kNDim>::fillBuffered>(input, minVal, maxVal);
474 R6::Dim<DataType_t,kNDim>::EE::Execute<R6::Dim<DataType_t,kNDim>::fillBuffered>(input, minVal, maxVal);
475 R6::Dim<DataType_t,kNDim>::EE::Execute<R6::Dim<DataType_t,kNDim>::fillN>(input, minVal, maxVal);
476 R6::Dim<DataType_t,kNDim>::EE::Execute<R6::Dim<DataType_t,kNDim>::fillN>(input, minVal, maxVal);
482 R6::Dim<DataType_t,kNDim>::II::Execute<R6::Dim<DataType_t,kNDim>::fillBuffered>(input, minVal, maxVal);
483 R6::Dim<DataType_t,kNDim>::II::Execute<R6::Dim<DataType_t,kNDim>::fillBuffered>(input, minVal, maxVal);
484 R6::Dim<DataType_t,kNDim>::II::Execute<R6::Dim<DataType_t,kNDim>::fillN>(input, minVal, maxVal);
485 R6::Dim<DataType_t,kNDim>::II::Execute<R6::Dim<DataType_t,kNDim>::fillN>(input, minVal, maxVal);
497 using DataType_t = float;
498 using InputType_t = double;
499 constexpr
unsigned short kNDim = 2;
503 std::vector<InputType_t> input;
506 double minVal = -5.0;
507 double maxVal = +5.0;
516 R7::Dim<DataType_t,kNDim>::EE::Execute<R7::Dim<DataType_t,kNDim>::fillBuffered >(input, minVal, maxVal);
517 R7::Dim<DataType_t,kNDim>::EE::Execute<R7::Dim<DataType_t,kNDim>::fillBuffered >(input, minVal, maxVal);
518 R7::Dim<DataType_t,kNDim>::EE::Execute<R7::Dim<DataType_t,kNDim>::fillN>(input, minVal, maxVal);
519 R7::Dim<DataType_t,kNDim>::EE::Execute<R7::Dim<DataType_t,kNDim>::fillN>(input, minVal, maxVal);
525 R7::Dim<DataType_t,kNDim>::II::Execute<R7::Dim<DataType_t,kNDim>::fillBuffered>(input, minVal, maxVal);
526 R7::Dim<DataType_t,kNDim>::II::Execute<R7::Dim<DataType_t,kNDim>::fillBuffered>(input, minVal, maxVal);
527 R7::Dim<DataType_t,kNDim>::II::Execute<R7::Dim<DataType_t,kNDim>::fillN>(input, minVal, maxVal);
528 R7::Dim<DataType_t,kNDim>::II::Execute<R7::Dim<DataType_t,kNDim>::fillN>(input, minVal, maxVal);
534 R6::Dim<DataType_t,kNDim>::EE::Execute<R6::Dim<DataType_t,kNDim>::fillBuffered>(input, minVal, maxVal);
535 R6::Dim<DataType_t,kNDim>::EE::Execute<R6::Dim<DataType_t,kNDim>::fillBuffered>(input, minVal, maxVal);
536 R6::Dim<DataType_t,kNDim>::EE::Execute<R6::Dim<DataType_t,kNDim>::fillN>(input, minVal, maxVal);
537 R6::Dim<DataType_t,kNDim>::EE::Execute<R6::Dim<DataType_t,kNDim>::fillN>(input, minVal, maxVal);
543 R6::Dim<DataType_t,kNDim>::II::Execute<R6::Dim<DataType_t,kNDim>::fillBuffered>(input, minVal, maxVal);
544 R6::Dim<DataType_t,kNDim>::II::Execute<R6::Dim<DataType_t,kNDim>::fillBuffered>(input, minVal, maxVal);
545 R6::Dim<DataType_t,kNDim>::II::Execute<R6::Dim<DataType_t,kNDim>::fillN>(input, minVal, maxVal);
546 R6::Dim<DataType_t,kNDim>::II::Execute<R6::Dim<DataType_t,kNDim>::fillN>(input, minVal, maxVal);
554 using DataType_t = double;
555 using InputType_t = double;
556 static constexpr
unsigned short kNDim = 1;
560 std::vector<InputType_t> input;
563 double minVal = -5.0;
564 double maxVal = +5.0;
573 R7::Dim<DataType_t,kNDim>::EE::Execute<R7::Dim<DataType_t,kNDim>::fillBuffered >(input, minVal, maxVal);
574 R7::Dim<DataType_t,kNDim>::EE::Execute<R7::Dim<DataType_t,kNDim>::fillBuffered >(input, minVal, maxVal);
575 R7::Dim<DataType_t,kNDim>::EE::Execute<R7::Dim<DataType_t,kNDim>::fillN>(input, minVal, maxVal);
576 R7::Dim<DataType_t,kNDim>::EE::Execute<R7::Dim<DataType_t,kNDim>::fillN>(input, minVal, maxVal);
582 R7::Dim<DataType_t,kNDim>::II::Execute<R7::Dim<DataType_t,kNDim>::fillBuffered>(input, minVal, maxVal);
583 R7::Dim<DataType_t,kNDim>::II::Execute<R7::Dim<DataType_t,kNDim>::fillBuffered>(input, minVal, maxVal);
584 R7::Dim<DataType_t,kNDim>::II::Execute<R7::Dim<DataType_t,kNDim>::fillN>(input, minVal, maxVal);
585 R7::Dim<DataType_t,kNDim>::II::Execute<R7::Dim<DataType_t,kNDim>::fillN>(input, minVal, maxVal);
591 R6::Dim<DataType_t,kNDim>::EE::Execute<R6::Dim<DataType_t,kNDim>::fillBuffered>(input, minVal, maxVal);
592 R6::Dim<DataType_t,kNDim>::EE::Execute<R6::Dim<DataType_t,kNDim>::fillBuffered>(input, minVal, maxVal);
593 R6::Dim<DataType_t,kNDim>::EE::Execute<R6::Dim<DataType_t,kNDim>::fillN>(input, minVal, maxVal);
594 R6::Dim<DataType_t,kNDim>::EE::Execute<R6::Dim<DataType_t,kNDim>::fillN>(input, minVal, maxVal);
600 R6::Dim<DataType_t,kNDim>::II::Execute<R6::Dim<DataType_t,kNDim>::fillBuffered>(input, minVal, maxVal);
601 R6::Dim<DataType_t,kNDim>::II::Execute<R6::Dim<DataType_t,kNDim>::fillBuffered>(input, minVal, maxVal);
602 R6::Dim<DataType_t,kNDim>::II::Execute<R6::Dim<DataType_t,kNDim>::fillN>(input, minVal, maxVal);
603 R6::Dim<DataType_t,kNDim>::II::Execute<R6::Dim<DataType_t,kNDim>::fillN>(input, minVal, maxVal);
611 using DataType_t = float;
612 using InputType_t = double;
613 static constexpr
unsigned short kNDim = 1;
617 std::vector<InputType_t> input;
620 double minVal = -5.0;
621 double maxVal = +5.0;
630 R7::Dim<DataType_t,kNDim>::EE::Execute<R7::Dim<DataType_t,kNDim>::fillBuffered >(input, minVal, maxVal);
631 R7::Dim<DataType_t,kNDim>::EE::Execute<R7::Dim<DataType_t,kNDim>::fillBuffered >(input, minVal, maxVal);
632 R7::Dim<DataType_t,kNDim>::EE::Execute<R7::Dim<DataType_t,kNDim>::fillN>(input, minVal, maxVal);
633 R7::Dim<DataType_t,kNDim>::EE::Execute<R7::Dim<DataType_t,kNDim>::fillN>(input, minVal, maxVal);
639 R7::Dim<DataType_t,kNDim>::II::Execute<R7::Dim<DataType_t,kNDim>::fillBuffered>(input, minVal, maxVal);
640 R7::Dim<DataType_t,kNDim>::II::Execute<R7::Dim<DataType_t,kNDim>::fillBuffered>(input, minVal, maxVal);
641 R7::Dim<DataType_t,kNDim>::II::Execute<R7::Dim<DataType_t,kNDim>::fillN>(input, minVal, maxVal);
642 R7::Dim<DataType_t,kNDim>::II::Execute<R7::Dim<DataType_t,kNDim>::fillN>(input, minVal, maxVal);
648 R6::Dim<DataType_t,kNDim>::EE::Execute<R6::Dim<DataType_t,kNDim>::fillBuffered>(input, minVal, maxVal);
649 R6::Dim<DataType_t,kNDim>::EE::Execute<R6::Dim<DataType_t,kNDim>::fillBuffered>(input, minVal, maxVal);
650 R6::Dim<DataType_t,kNDim>::EE::Execute<R6::Dim<DataType_t,kNDim>::fillN>(input, minVal, maxVal);
651 R6::Dim<DataType_t,kNDim>::EE::Execute<R6::Dim<DataType_t,kNDim>::fillN>(input, minVal, maxVal);
657 R6::Dim<DataType_t,kNDim>::II::Execute<R6::Dim<DataType_t,kNDim>::fillBuffered>(input, minVal, maxVal);
658 R6::Dim<DataType_t,kNDim>::II::Execute<R6::Dim<DataType_t,kNDim>::fillBuffered>(input, minVal, maxVal);
659 R6::Dim<DataType_t,kNDim>::II::Execute<R6::Dim<DataType_t,kNDim>::fillN>(input, minVal, maxVal);
660 R6::Dim<DataType_t,kNDim>::II::Execute<R6::Dim<DataType_t,kNDim>::fillN>(input, minVal, maxVal);
674 int main(
int argc,
char **argv) {
void speedtest< float, 1 >(size_t count)
Random number generator class based on M.
Namespace for new ROOT classes and functions.
void swap(TDirectoryEntry &e1, TDirectoryEntry &e2) noexcept
THist< 1, float, THistStatContent, THistStatUncertainty > TH1F
void GenerateInput(std::vector< T > &numbers, double minVal, double maxVal, UInt_t seed)
const char * GetHist< 2, double >()
const char * GetHist< 1, float >()
static void AddDirectory(Bool_t add=kTRUE)
Sets the flag controlling the automatic add of histograms in memory.
void speedtest< float, 2 >(size_t count)
const char * GetHist< 2, float >()
const char * GetHist< 1, double >()
Objects used to configure the different axis types.
RooCmdArg Timer(Bool_t flag=kTRUE)
void speedtest< double, 2 >(size_t count)
Histogram class for histograms with DIMENSIONS dimensions, where each bin count is stored by a value ...
static Int_t GetDefaultBufferSize()
Static function return the default buffer size for automatic histograms the parameter fgBufferSize ma...
void speedtest(size_t count=(size_t)(1e6))
virtual Double_t Rndm()
TausWorth generator from L'Ecuyer, uses as seed 3x32bits integers Use a mask of 0xffffffffUL to make ...
THist< 2, double, THistStatContent, THistStatUncertainty > TH2D
std::string MakeTitle(std::string_view version, std::string_view histname, std::string_view title, std::string_view axis)
void speedtest< double, 1 >(size_t count)
void histspeedtest(size_t iter, int what)
THist< 1, double, THistStatContent, THistStatUncertainty > TH1D
THist< 2, float, THistStatContent, THistStatUncertainty > TH2F
int main(int argc, char **argv)