Logo ROOT   6.07/09
Reference Guide
histspeedtest.cxx
Go to the documentation of this file.
1 /// \file
2 /// \ingroup tutorial_v7
3 ///
4 /// \macro_code
5 ///
6 /// \warning This is part of the ROOT 7 prototype! It will change without notice. It might trigger earthquakes. Feedback is welcome!
7 /// \author Axel Naumann <axel@cern.ch>
8 
9 #include "TRandom3.h"
10 #include <vector>
11 #include <chrono>
12 #include <iostream>
13 
14 #include "TH1.h"
15 #include "TH2.h"
16 #include "TH3.h"
17 
18 #include "ROOT/THist.hxx"
20 
21 using namespace ROOT;
22 using namespace std;
23 
24 struct Timer {
25  using TimePoint_t = decltype( std::chrono::high_resolution_clock::now() );
26 
27  const char *fTitle;
28  size_t fCount;
29  TimePoint_t fStart;
30 
31  Timer(const char *title, size_t count) : fTitle(title), fCount(count),
32  fStart(std::chrono::high_resolution_clock::now()) {}
33 
34  ~Timer() {
35  using namespace std::chrono;
36  auto end = high_resolution_clock::now();
37  duration<double> time_span = duration_cast<duration<double>>(end - fStart);
38  //std::cout << fCount << " * " << fTitle << ": " << time_span.count() << " seconds \n";
39  //std::cout << fCount << " * " << fTitle << ": " << fCount / (1e6) / time_span.count() << " millions per seconds \n";
40  std::cout << fCount << " * " << fTitle << ": " << time_span.count() << " seconds, \t";
41  std::cout << fCount / (1e6) / time_span.count() << " millions per seconds \n";
42  }
43 };
44 
45 constexpr UInt_t gStride = 32; // TH1::GetDefaultBufferSize()
46 
47 struct BinEdges
48 {
49  static constexpr size_t fNBinsX = 4;
50  static constexpr size_t fNBinsY = 5;
51  double fXBins[4];
52  double fYBins[5];
53 
54  BinEdges(double minValue, double maxValue) {
55  if (maxValue < minValue) swap(minValue,maxValue);
56  double range = maxValue - minValue;
57 
58  double x[fNBinsX] = {0., 0.1, 0.3, 1.};
59  double y[fNBinsY] = {0., 0.1, 0.2, 0.3, 1.};
60 
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];
65 
66  }
67 
68  using AConf_t = Experimental::TAxisConfig;
69 
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()); }
72 
73 };
74 
75 template <typename T>
76 void GenerateInput(std::vector<T> &numbers, double minVal, double maxVal, UInt_t seed)
77 {
78  Timer t("GenerateInput",numbers.size());
79  if (minVal > maxVal) {
80  std::swap(minVal,maxVal);
81  }
82  T range = maxVal - minVal;
83  TRandom3 r(seed);
84  size_t len = numbers.size();
85  for(auto c = numbers.begin(); c != numbers.end(); ++c) {
86  *c = minVal + range * r.Rndm();
87  }
88 }
89 
90 std::string MakeTitle(std::string_view version,
91  std::string_view histname,
92  std::string_view title,
93  std::string_view axis)
94 {
95  std::string result = std::string(version) + " " + std::string(histname) + " " + title.to_string() + " [" + axis.to_string() + "]";
96  return result;
97 }
98 
99 template <int dim, typename type> const char *GetHist();
100 
101 template <> const char *GetHist<2,double>(){ return "2D"; };
102 template <> const char *GetHist<2,float>() { return "2F"; };
103 
104 template <> const char *GetHist<1,double>(){ return "1D"; };
105 template <> const char *GetHist<1,float>() { return "1F"; };
106 
107 
108 namespace R7 {
109  const char *gVersion = "R7";
110 
111  template <typename T, unsigned short kNDim> struct Dim;
112 
113  template <typename T>
114  struct Dim<T,2> {
115 
116  constexpr static unsigned short kNDim = 2;
118 
119  // This is odd ...
120  using InputType_t = double;
121 
122  using FillFunc_t = std::add_pointer_t<long(ExpTH2 &hist, std::vector<InputType_t> &input, std::string_view type)>;
123 
124 
125  struct EE {
126  static constexpr const char * const gType = "regular bin size ";
127 
128  template <FillFunc_t filler>
129  static long Execute(std::vector<InputType_t> &input, double minVal, double maxVal) {
130 
131  ExpTH2 hist({100, minVal, maxVal}, {5, minVal, maxVal});
132  return filler(hist,input,gType);
133  }
134  };
135 
136  struct II {
137  static constexpr const char * const gType = "irregular bin size";
138 
139  template <FillFunc_t filler>
140  static long Execute(std::vector<InputType_t> &input, double minVal, double maxVal) {
141 
142  BinEdges edges(minVal,maxVal);
143  ExpTH2 hist( edges.GetConfigX(), edges.GetConfigY() );
144  return filler(hist,input,gType);
145  }
146  };
147 
148  inline static long fillN(ExpTH2 &hist, std::vector<InputType_t> &input, std::string_view gType) {
149 
150  // This is odd :( ...
151  using array_t = std::array<InputType_t, 2>;
152  array_t *values = (array_t*)(&input[0]);
153  constexpr size_t stride = gStride;
154 
155  std::string title = MakeTitle(gVersion, GetHist<kNDim, T>(), "fills N (stride 32)", gType);
156  {
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});
160  }
161  return hist.GetNDim();
162  }
163 
164 
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);
168  {
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]});
172  }
173  return hist.GetNDim();
174  }
175 
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);
178  {
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]});
182  }
183  return hist.GetNDim();
184  }
185  }; // DimD
186 
187 
188  template <typename T>
189  struct Dim<T,1> {
190 
191  constexpr static unsigned short kNDim = 1;
193 
194  // This is odd ...
195  using InputType_t = double;
196 
197  using FillFunc_t = std::add_pointer_t<long(ExpTH1 &hist, std::vector<InputType_t> &input, std::string_view type)>;
198 
199 
200  struct EE {
201  static constexpr const char * const gType = "regular bin size ";
202 
203  template <FillFunc_t filler>
204  static long Execute(std::vector<InputType_t> &input, double minVal, double maxVal) {
205 
206  ExpTH1 hist({100, minVal, maxVal});
207  return filler(hist,input,gType);
208  }
209  };
210 
211  struct II {
212  static constexpr const char * const gType = "irregular bin size";
213 
214  template <FillFunc_t filler>
215  static long Execute(std::vector<InputType_t> &input, double minVal, double maxVal) {
216 
217  BinEdges edges(minVal,maxVal);
218  ExpTH1 hist( edges.GetConfigX() );
219  return filler(hist,input,gType);
220  }
221  };
222 
223  inline static long fillN(ExpTH1 &hist, std::vector<InputType_t> &input, std::string_view gType) {
224 
225  // This is odd :( ...
226  using array_t = std::array<InputType_t, 1>;
227  array_t *values = (array_t*)(&input[0]);
228  constexpr size_t stride = gStride;
229 
230  std::string title = MakeTitle(gVersion, GetHist<kNDim, T>(), "fills N (stride 32)", gType);
231  {
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});
235  }
236  return hist.GetNDim();
237  }
238 
239 
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);
243  {
244  Timer t(title.c_str(),input.size());
245  for (size_t i = 0; i < input.size(); ++i)
246  filler.Fill({input[i]});
247  }
248  return hist.GetNDim();
249  }
250 
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);
253  {
254  Timer t(title.c_str(),input.size());
255  for (size_t i = 0; i < input.size(); ++i)
256  hist.Fill({input[i]});
257  }
258  return hist.GetNDim();
259  }
260  }; // Dim1
261 
262 
263 
264 } // R7
265 
266 
267 
268 
269 namespace R6 {
270  const char *gVersion = "R6";
271 
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; };
277 
278  template <typename T, int kNDim> struct Dim;
279 
280  template <typename T>
281  struct Dim<T,2> {
282 
283  constexpr static unsigned short kNDim = 2;
284  using HistType_t = typename Redirect<kNDim,T>::HistType_t;
285 
286  // This is odd ...
287  using InputType_t = double;
288 
289  using FillFunc_t = std::add_pointer_t<long(HistType_t &hist, std::vector<InputType_t> &input, std::string_view type)>;
290 
291 
292  struct EE {
293 
294  static constexpr const char * const gType = "regular bin size ";
295 
296  template <FillFunc_t filler>
297  static long Execute(std::vector<InputType_t> &input, double minVal, double maxVal) {
298 
299  HistType_t hist("a", "a hist", 100, minVal, maxVal, 5, minVal, maxVal);
300  return filler(hist,input,gType);
301  }
302  };
303 
304  struct II {
305 
306  static constexpr const char * const gType = "irregular bin size";
307 
308  template <FillFunc_t filler>
309  static long Execute(std::vector<InputType_t> &input, double minVal, double maxVal) {
310 
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);
314  }
315  };
316 
317 
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);
320  hist.SetBuffer(TH1::GetDefaultBufferSize());
321  {
322  //Timer t("R6 2D fills [regular bins size]",input.size()/2);
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]);
326  }
327  return (long)hist.GetEntries();
328  }
329 
330 
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;
334  {
335  //Timer t("R6 2D fills [regular bins size]",input.size()/2);
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);
339  }
340  return (long)hist.GetEntries();
341  }
342 
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);
345  {
346  //Timer t("R6 2D fills [regular bins size]",input.size()/2);
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]);
350  }
351  return (long)hist.GetEntries();
352  }
353  }; // Dim
354 
355  template <typename T>
356  struct Dim<T,1> {
357 
358  constexpr static unsigned short kNDim = 1;
359  using HistType_t = typename Redirect<kNDim,T>::HistType_t;
360 
361  // This is odd ...
362  using InputType_t = double;
363 
364  using FillFunc_t = std::add_pointer_t<long(HistType_t &hist, std::vector<InputType_t> &input, std::string_view type)>;
365 
366 
367  struct EE {
368 
369  static constexpr const char * const gType = "regular bin size ";
370 
371  template <FillFunc_t filler>
372  static long Execute(std::vector<InputType_t> &input, double minVal, double maxVal) {
373 
374  HistType_t hist("a", "a hist", 100, minVal, maxVal);
375  return filler(hist,input,gType);
376  }
377  };
378 
379  struct II {
380 
381  static constexpr const char * const gType = "irregular bin size";
382 
383  template <FillFunc_t filler>
384  static long Execute(std::vector<InputType_t> &input, double minVal, double maxVal) {
385 
386  BinEdges edges(minVal,maxVal);
387  HistType_t hist("a", "a hist", edges.fNBinsX - 1, edges.fXBins);
388  return filler(hist,input,gType);
389  }
390  };
391 
392 
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);
395  hist.SetBuffer(TH1::GetDefaultBufferSize());
396  {
397  //Timer t("R6 2D fills [regular bins size]",input.size()/2);
398  Timer t(title.c_str(),input.size());
399  for (size_t i = 0; i < input.size()-1; ++i)
400  hist.Fill(input[i]);
401  }
402  return (long)hist.GetEntries();
403  }
404 
405 
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;
409  {
410  //Timer t("R6 2D fills [regular bins size]",input.size()/2);
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);
414  }
415  return (long)hist.GetEntries();
416  }
417 
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);
420  {
421  //Timer t("R6 2D fills [regular bins size]",input.size()/2);
422  Timer t(title.c_str(),input.size());
423  for (size_t i = 0; i < input.size(); ++i)
424  hist.Fill(input[i]);
425  }
426  return (long)hist.GetEntries();
427  }
428  }; // Dim1
429 }
430 
431 template <typename T,unsigned short kNDim>
432 void speedtest(size_t count = (size_t)(1e6));
433 
434 template <>
435 void speedtest<double,2>(size_t count) {
436  using DataType_t = double;
437  using InputType_t = double;
438  static constexpr unsigned short kNDim = 2;
439 
441 
442  std::vector<InputType_t> input; // (count);
443  input.resize(count);
444 
445  double minVal = -5.0;
446  double maxVal = +5.0;
447  GenerateInput(input, minVal, maxVal, 0);
448 
449  // Make sure we have some overflow.
450  minVal *= 0.9;
451  maxVal *= 0.9;
452 
453  cout << '\n';
454 
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);
459  R7::Dim<DataType_t,kNDim>::EE::Execute<R7::Dim<DataType_t,kNDim>::fill>(input, minVal, maxVal);
460  R7::Dim<DataType_t,kNDim>::EE::Execute<R7::Dim<DataType_t,kNDim>::fill>(input, minVal, maxVal);
461 
462  cout << '\n';
463 
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);
468  R7::Dim<DataType_t,kNDim>::II::Execute<R7::Dim<DataType_t,kNDim>::fill>(input, minVal, maxVal);
469  R7::Dim<DataType_t,kNDim>::II::Execute<R7::Dim<DataType_t,kNDim>::fill>(input, minVal, maxVal);
470 
471  cout << '\n';
472 
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);
477  R6::Dim<DataType_t,kNDim>::EE::Execute<R6::Dim<DataType_t,kNDim>::fill>(input, minVal, maxVal);
478  R6::Dim<DataType_t,kNDim>::EE::Execute<R6::Dim<DataType_t,kNDim>::fill>(input, minVal, maxVal);
479 
480  cout << '\n';
481 
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);
486  R6::Dim<DataType_t,kNDim>::II::Execute<R6::Dim<DataType_t,kNDim>::fill>(input, minVal, maxVal);
487  R6::Dim<DataType_t,kNDim>::II::Execute<R6::Dim<DataType_t,kNDim>::fill>(input, minVal, maxVal);
488 
489  cout << '\n';
490 }
491 
492 
493 // these are copy/paste to work around failure to properly instantiate the template :(
494 
495 template <>
496 void speedtest<float,2>(size_t count) {
497  using DataType_t = float;
498  using InputType_t = double;
499  constexpr unsigned short kNDim = 2;
500 
502 
503  std::vector<InputType_t> input; // (count);
504  input.resize(count);
505 
506  double minVal = -5.0;
507  double maxVal = +5.0;
508  GenerateInput(input, minVal, maxVal, 0);
509 
510  // Make sure we have some overflow.
511  minVal *= 0.9;
512  maxVal *= 0.9;
513 
514  cout << '\n';
515 
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);
520  R7::Dim<DataType_t,kNDim>::EE::Execute<R7::Dim<DataType_t,kNDim>::fill>(input, minVal, maxVal);
521  R7::Dim<DataType_t,kNDim>::EE::Execute<R7::Dim<DataType_t,kNDim>::fill>(input, minVal, maxVal);
522 
523  cout << '\n';
524 
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);
529  R7::Dim<DataType_t,kNDim>::II::Execute<R7::Dim<DataType_t,kNDim>::fill>(input, minVal, maxVal);
530  R7::Dim<DataType_t,kNDim>::II::Execute<R7::Dim<DataType_t,kNDim>::fill>(input, minVal, maxVal);
531 
532  cout << '\n';
533 
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);
538  R6::Dim<DataType_t,kNDim>::EE::Execute<R6::Dim<DataType_t,kNDim>::fill>(input, minVal, maxVal);
539  R6::Dim<DataType_t,kNDim>::EE::Execute<R6::Dim<DataType_t,kNDim>::fill>(input, minVal, maxVal);
540 
541  cout << '\n';
542 
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);
547  R6::Dim<DataType_t,kNDim>::II::Execute<R6::Dim<DataType_t,kNDim>::fill>(input, minVal, maxVal);
548  R6::Dim<DataType_t,kNDim>::II::Execute<R6::Dim<DataType_t,kNDim>::fill>(input, minVal, maxVal);
549 
550 }
551 
552 template <>
553 void speedtest<double,1>(size_t count) {
554  using DataType_t = double;
555  using InputType_t = double;
556  static constexpr unsigned short kNDim = 1;
557 
559 
560  std::vector<InputType_t> input; // (count);
561  input.resize(count);
562 
563  double minVal = -5.0;
564  double maxVal = +5.0;
565  GenerateInput(input, minVal, maxVal, 0);
566 
567  // Make sure we have some overflow.
568  minVal *= 0.9;
569  maxVal *= 0.9;
570 
571  cout << '\n';
572 
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);
577  R7::Dim<DataType_t,kNDim>::EE::Execute<R7::Dim<DataType_t,kNDim>::fill>(input, minVal, maxVal);
578  R7::Dim<DataType_t,kNDim>::EE::Execute<R7::Dim<DataType_t,kNDim>::fill>(input, minVal, maxVal);
579 
580  cout << '\n';
581 
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);
586  R7::Dim<DataType_t,kNDim>::II::Execute<R7::Dim<DataType_t,kNDim>::fill>(input, minVal, maxVal);
587  R7::Dim<DataType_t,kNDim>::II::Execute<R7::Dim<DataType_t,kNDim>::fill>(input, minVal, maxVal);
588 
589  cout << '\n';
590 
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);
595  R6::Dim<DataType_t,kNDim>::EE::Execute<R6::Dim<DataType_t,kNDim>::fill>(input, minVal, maxVal);
596  R6::Dim<DataType_t,kNDim>::EE::Execute<R6::Dim<DataType_t,kNDim>::fill>(input, minVal, maxVal);
597 
598  cout << '\n';
599 
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);
604  R6::Dim<DataType_t,kNDim>::II::Execute<R6::Dim<DataType_t,kNDim>::fill>(input, minVal, maxVal);
605  R6::Dim<DataType_t,kNDim>::II::Execute<R6::Dim<DataType_t,kNDim>::fill>(input, minVal, maxVal);
606 
607 }
608 
609 template <>
610 void speedtest<float,1>(size_t count) {
611  using DataType_t = float;
612  using InputType_t = double;
613  static constexpr unsigned short kNDim = 1;
614 
616 
617  std::vector<InputType_t> input; // (count);
618  input.resize(count);
619 
620  double minVal = -5.0;
621  double maxVal = +5.0;
622  GenerateInput(input, minVal, maxVal, 0);
623 
624  // Make sure we have some overflow.
625  minVal *= 0.9;
626  maxVal *= 0.9;
627 
628  cout << '\n';
629 
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);
634  R7::Dim<DataType_t,kNDim>::EE::Execute<R7::Dim<DataType_t,kNDim>::fill>(input, minVal, maxVal);
635  R7::Dim<DataType_t,kNDim>::EE::Execute<R7::Dim<DataType_t,kNDim>::fill>(input, minVal, maxVal);
636 
637  cout << '\n';
638 
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);
643  R7::Dim<DataType_t,kNDim>::II::Execute<R7::Dim<DataType_t,kNDim>::fill>(input, minVal, maxVal);
644  R7::Dim<DataType_t,kNDim>::II::Execute<R7::Dim<DataType_t,kNDim>::fill>(input, minVal, maxVal);
645 
646  cout << '\n';
647 
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);
652  R6::Dim<DataType_t,kNDim>::EE::Execute<R6::Dim<DataType_t,kNDim>::fill>(input, minVal, maxVal);
653  R6::Dim<DataType_t,kNDim>::EE::Execute<R6::Dim<DataType_t,kNDim>::fill>(input, minVal, maxVal);
654 
655  cout << '\n';
656 
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);
661  R6::Dim<DataType_t,kNDim>::II::Execute<R6::Dim<DataType_t,kNDim>::fill>(input, minVal, maxVal);
662  R6::Dim<DataType_t,kNDim>::II::Execute<R6::Dim<DataType_t,kNDim>::fill>(input, minVal, maxVal);
663 
664 }
665 
666 void histspeedtest(size_t iter = 1e6)
667 {
668  speedtest<double,2>(iter);
669  speedtest<float,2>(iter);
670  speedtest<double,1>(iter);
671  speedtest<float,1>(iter);
672 }
673 
674 int main(int argc, char **argv) {
675 
676  size_t iter = 1e9;
677 
678  histspeedtest(iter);
679 }
void speedtest< float, 1 >(size_t count)
Definition: speedtest.cxx:632
Random number generator class based on M.
Definition: TRandom3.h:29
This namespace contains pre-defined functions to be used in conjuction with TExecutor::Map and TExecu...
Definition: StringConv.hxx:21
return c
void swap(TDirectoryEntry &e1, TDirectoryEntry &e2) noexcept
double T(double x)
Definition: ChebyshevPol.h:34
THist< 1, float, THistStatContent, THistStatUncertainty > TH1F
Definition: THist.hxx:302
void GenerateInput(std::vector< T > &numbers, double minVal, double maxVal, UInt_t seed)
Definition: speedtest.cxx:101
fill
Definition: fit1_py.py:6
_LIBCPP_INLINE_VISIBILITY basic_string< _CharT, _Traits, _Allocator > to_string(const _Allocator &__a=_Allocator()) const
const Bool_t kFALSE
Definition: Rtypes.h:92
const char * GetHist< 2, double >()
Definition: speedtest.cxx:126
STL namespace.
const char * GetHist< 1, float >()
Definition: speedtest.cxx:130
static void AddDirectory(Bool_t add=kTRUE)
Sets the flag controlling the automatic add of histograms in memory.
Definition: TH1.cxx:1220
Double_t x[n]
Definition: legend1.C:17
void speedtest< float, 2 >(size_t count)
Definition: speedtest.cxx:542
const char * gVersion
Definition: speedtest.cxx:134
const char * GetHist< 2, float >()
Definition: speedtest.cxx:127
constexpr UInt_t gStride
Definition: speedtest.cxx:70
const char * GetHist< 1, double >()
Definition: speedtest.cxx:129
Objects used to configure the different axis types.
Definition: TAxis.hxx:706
RooCmdArg Timer(Bool_t flag=kTRUE)
TRandom2 r(17)
static int gType
Definition: proofexecv.cxx:47
unsigned int UInt_t
Definition: RtypesCore.h:42
void speedtest< double, 2 >(size_t count)
Definition: speedtest.cxx:493
Histogram class for histograms with DIMENSIONS dimensions, where each bin count is stored by a value ...
Definition: THist.hxx:33
static Int_t GetDefaultBufferSize()
Static function return the default buffer size for automatic histograms the parameter fgBufferSize ma...
Definition: TH1.cxx:4038
void speedtest(size_t count=(size_t)(1e6))
virtual Double_t Rndm()
TausWorth generator from L&#39;Ecuyer, uses as seed 3x32bits integers Use a mask of 0xffffffffUL to make ...
Definition: TRandom2.cxx:58
const char * GetHist()
int type
Definition: TGX11.cxx:120
Double_t y[n]
Definition: legend1.C:17
THist< 2, double, THistStatContent, THistStatUncertainty > TH2D
Definition: THist.hxx:307
std::string MakeTitle(std::string_view version, std::string_view histname, std::string_view title, std::string_view axis)
Definition: speedtest.cxx:115
void speedtest< double, 1 >(size_t count)
Definition: speedtest.cxx:587
void histspeedtest(size_t iter, int what)
Definition: speedtest.cxx:676
THist< 1, double, THistStatContent, THistStatUncertainty > TH1D
Definition: THist.hxx:301
double result[121]
THist< 2, float, THistStatContent, THistStatUncertainty > TH2F
Definition: THist.hxx:308
int main(int argc, char **argv)