22 constexpr 
unsigned short gRepeat = 2;
 
   52 #define STATCLASSES Experimental::RHistStatContent, Experimental::RHistStatUncertainty 
   56    using TimePoint_t = decltype(std::chrono::high_resolution_clock::now());
 
   62    Timer(
const char *title, 
size_t count)
 
   63       : fTitle(title), fCount(count), fStart(std::chrono::high_resolution_clock::now())
 
   68       using namespace std::chrono;
 
   69       auto end = high_resolution_clock::now();
 
   70       duration<double> time_span = duration_cast<duration<double>>(end - fStart);
 
   74       std::cout << fCount << 
" * " << fTitle << 
": " << time_span.count() << 
" seconds, \t";
 
   75       std::cout << fCount / (1e6) / time_span.count() << 
" millions per seconds \n";
 
   79 constexpr UInt_t gStride = 32; 
 
   82    static constexpr 
size_t fNBinsX = 4;
 
   83    static constexpr 
size_t fNBinsY = 5;
 
   87    BinEdges(
double minValue, 
double maxValue)
 
   89       if (maxValue < minValue)
 
   90          swap(minValue, maxValue);
 
   91       double range = maxValue - minValue;
 
   93       double x[fNBinsX] = {0., 0.1, 0.3, 1.};
 
   94       double y[fNBinsY] = {0., 0.1, 0.2, 0.3, 1.};
 
   96       for (
size_t i = 0; i < fNBinsX; ++i)
 
   97          fXBins[i] = minValue + range * x[i];
 
   98       for (
size_t i = 0; i < fNBinsY; ++i)
 
   99          fYBins[i] = minValue + range * y[i];
 
  102    using AConf_t = Experimental::RAxisConfig;
 
  104    AConf_t GetConfigX()
 const { 
return AConf_t(std::span<const double>(fXBins).to_vector()); }
 
  105    AConf_t GetConfigY()
 const { 
return AConf_t(std::span<const double>(fYBins).to_vector()); }
 
  108 template <
typename T>
 
  109 void GenerateInput(std::vector<T> &numbers, 
double minVal, 
double maxVal, UInt_t seed)
 
  111    Timer t(
"GenerateInput", numbers.size());
 
  112    if (minVal > maxVal) {
 
  113       std::swap(minVal, maxVal);
 
  115    T range = maxVal - minVal;
 
  117    size_t len = numbers.size();
 
  118    for (
auto c = numbers.begin(); c != numbers.end(); ++c) {
 
  119       *c = minVal + range * r.Rndm();
 
  124 MakeTitle(std::string_view version, std::string_view histname, std::string_view title, std::string_view axis)
 
  127       std::string(version) + 
" " + std::string(histname) + 
" " + std::string(title) + 
" [" + std::string(axis) + 
"]";
 
  131 template <
int dim, 
typename type>
 
  132 const char *GetHist();
 
  135 const char *GetHist<2, double>()
 
  140 const char *GetHist<2, float>()
 
  146 const char *GetHist<1, double>()
 
  151 const char *GetHist<1, float>()
 
  157 const char *gVersion = 
"R7";
 
  159 template <
typename T, 
unsigned short kNDim>
 
  162 template <
typename T>
 
  165    constexpr 
static unsigned short kNDim = 2;
 
  166    using ExpTH2 = Experimental::RHist<kNDim, T, STATCLASSES>;
 
  168    using FillFunc_t = std::add_pointer_t<long(ExpTH2 &hist, std::vector<double> &input, std::string_view type)>;
 
  171       static constexpr 
const char *
const gType = 
"regular bin size  ";
 
  173       template <FillFunc_t filler>
 
  174       static long Execute(std::vector<double> &input, 
double minVal, 
double maxVal)
 
  177          ExpTH2 hist({100, minVal, maxVal}, {5, minVal, maxVal});
 
  178          return filler(hist, input, gType);
 
  183       static constexpr 
const char *
const gType = 
"irregular bin size";
 
  185       template <FillFunc_t filler>
 
  186       static long Execute(std::vector<double> &input, 
double minVal, 
double maxVal)
 
  189          BinEdges edges(minVal, maxVal);
 
  190          ExpTH2 hist(edges.GetConfigX(), edges.GetConfigY());
 
  191          return filler(hist, input, gType);
 
  195    inline static long fillN(ExpTH2 &hist, std::vector<double> &input, std::string_view gType)
 
  198       using array_t = Experimental::Hist::RCoordArray<2>;
 
  199       array_t *values = (array_t *)(&input[0]);
 
  200       constexpr 
size_t stride = gStride;
 
  202       std::string title = MakeTitle(gVersion, GetHist<kNDim, T>(), 
"fills N (stride 32)", gType);
 
  204          Timer t(title.c_str(), input.size() / 2);
 
  205          for (
size_t i = 0; i < (input.size() - (stride * 2 - 1)); i += (stride * 2), values += 32) {
 
  206             std::span<array_t> coords(values, 32);
 
  210       return hist.GetNDim();
 
  213    inline static long fillBuffered(ExpTH2 &hist, std::vector<double> &input, std::string_view gType)
 
  215       Experimental::RHistBufferedFill<ExpTH2> filler(hist);
 
  216       std::string title = MakeTitle(gVersion, GetHist<kNDim, T>(), 
"fills (buffered)   ", gType);
 
  218          Timer t(title.c_str(), input.size() / 2);
 
  219          for (
size_t i = 0; i < input.size() - 1; i += 2)
 
  220             filler.Fill({input[i], input[i + 1]});
 
  222       return hist.GetNDim();
 
  225    inline static long fill(ExpTH2 &hist, std::vector<double> &input, std::string_view gType)
 
  227       std::string title = MakeTitle(gVersion, GetHist<kNDim, T>(), 
"fills              ", gType);
 
  229          Timer t(title.c_str(), input.size() / 2);
 
  230          for (
size_t i = 0; i < input.size() - 1; i += 2)
 
  231             hist.Fill({input[i], input[i + 1]});
 
  233       return hist.GetNDim();
 
  237 template <
typename T>
 
  240    constexpr 
static unsigned short kNDim = 1;
 
  241    using ExpTH1 = Experimental::RHist<kNDim, T, STATCLASSES>;
 
  243    using FillFunc_t = std::add_pointer_t<long(ExpTH1 &hist, std::vector<double> &input, std::string_view type)>;
 
  246       static constexpr 
const char *
const gType = 
"regular bin size  ";
 
  248       template <FillFunc_t filler>
 
  249       static long Execute(std::vector<double> &input, 
double minVal, 
double maxVal)
 
  252          for (
unsigned short i = 0; i < gRepeat; ++i) {
 
  253             ExpTH1 hist({100, minVal, maxVal});
 
  254             result += filler(hist, input, gType);
 
  261       static constexpr 
const char *
const gType = 
"irregular bin size";
 
  263       template <FillFunc_t filler>
 
  264       static long Execute(std::vector<double> &input, 
double minVal, 
double maxVal)
 
  268          BinEdges edges(minVal, maxVal);
 
  269          for (
unsigned short i = 0; i < gRepeat; ++i) {
 
  270             ExpTH1 hist(edges.GetConfigX());
 
  271             result += filler(hist, input, gType);
 
  277    inline static long fillN(ExpTH1 &hist, std::vector<double> &input, std::string_view gType)
 
  280       using array_t = Experimental::Hist::RCoordArray<1>;
 
  281       array_t *values = (array_t *)(&input[0]);
 
  282       constexpr 
size_t stride = gStride;
 
  284       std::string title = MakeTitle(gVersion, GetHist<kNDim, T>(), 
"fills N (stride 32)", gType);
 
  286          Timer t(title.c_str(), input.size());
 
  287          for (
size_t i = 0; i < (input.size() - (stride - 1)); i += (stride), values += 32) {
 
  288             std::span<array_t> coords(values, 32);
 
  292       return hist.GetNDim();
 
  295    inline static long fillBuffered(ExpTH1 &hist, std::vector<double> &input, std::string_view gType)
 
  297       Experimental::RHistBufferedFill<ExpTH1> filler(hist);
 
  298       std::string title = MakeTitle(gVersion, GetHist<kNDim, T>(), 
"fills (buffered)   ", gType);
 
  300          Timer t(title.c_str(), input.size());
 
  301          for (
size_t i = 0; i < input.size(); ++i)
 
  302             filler.Fill({input[i]});
 
  304       return hist.GetNDim();
 
  307    inline static long fill(ExpTH1 &hist, std::vector<double> &input, std::string_view gType)
 
  309       std::string title = MakeTitle(gVersion, GetHist<kNDim, T>(), 
"fills              ", gType);
 
  311          Timer t(title.c_str(), input.size());
 
  312          for (
size_t i = 0; i < input.size(); ++i)
 
  313             hist.Fill({input[i]});
 
  315       return hist.GetNDim();
 
  322 const char *gVersion = 
"R6";
 
  324 template <
int ndim, 
typename T>
 
  327 struct Redirect<2, float> {
 
  328    using HistType_t = TH2F;
 
  331 struct Redirect<2, double> {
 
  332    using HistType_t = TH2D;
 
  335 struct Redirect<1, float> {
 
  336    using HistType_t = TH1F;
 
  339 struct Redirect<1, double> {
 
  340    using HistType_t = TH1D;
 
  343 template <
typename T, 
int kNDim>
 
  346 template <
typename T>
 
  349    constexpr 
static unsigned short kNDim = 2;
 
  350    using HistType_t = 
typename Redirect<kNDim, T>::HistType_t;
 
  352    using FillFunc_t = std::add_pointer_t<long(HistType_t &hist, std::vector<double> &input, std::string_view type)>;
 
  356       static constexpr 
const char *
const gType = 
"regular bin size  ";
 
  358       template <FillFunc_t filler>
 
  359       static long Execute(std::vector<double> &input, 
double minVal, 
double maxVal)
 
  363          for (
unsigned short i = 0; i < gRepeat; ++i) {
 
  364             HistType_t hist(
"a", 
"a hist", 100, minVal, maxVal, 5, minVal, maxVal);
 
  365             result += filler(hist, input, gType);
 
  373       static constexpr 
const char *
const gType = 
"irregular bin size";
 
  375       template <FillFunc_t filler>
 
  376       static long Execute(std::vector<double> &input, 
double minVal, 
double maxVal)
 
  379          BinEdges edges(minVal, maxVal);
 
  380          for (
unsigned short i = 0; i < gRepeat; ++i) {
 
  381             HistType_t hist(
"a", 
"a hist", edges.fNBinsX - 1, edges.fXBins, edges.fNBinsY - 1, edges.fYBins);
 
  382             result += filler(hist, input, gType);
 
  388    static long fillBuffered(HistType_t &hist, std::vector<double> &input, std::string_view gType)
 
  390       std::string title = MakeTitle(gVersion, GetHist<kNDim, T>(), 
"fills (buffered)   ", gType);
 
  391       hist.SetBuffer(TH1::GetDefaultBufferSize());
 
  394          Timer t(title.c_str(), input.size() / 2);
 
  395          for (
size_t i = 0; i < input.size() - 1; i += 2)
 
  396             hist.Fill(input[i], input[i + 1]);
 
  398       return (
long)hist.GetEntries();
 
  401    static long fillN(HistType_t &hist, std::vector<double> &input, std::string_view gType)
 
  403       std::string title = MakeTitle(gVersion, GetHist<kNDim, T>(), 
"fills N (stride 32)", gType);
 
  404       constexpr 
size_t stride = gStride;
 
  407          Timer t(title.c_str(), input.size() / 2);
 
  408          for (
size_t i = 0; i < (input.size() - (stride * 2 - 1)); i += (stride * 2))
 
  409             hist.FillN(gStride, &(input[i]), &(input[i + gStride]), 
nullptr);
 
  411       return (
long)hist.GetEntries();
 
  414    static long fill(HistType_t &hist, std::vector<double> &input, std::string_view gType)
 
  416       std::string title = MakeTitle(gVersion, GetHist<kNDim, T>(), 
"fills              ", gType);
 
  419          Timer t(title.c_str(), input.size() / 2);
 
  420          for (
size_t i = 0; i < input.size() - 1; i += 2)
 
  421             hist.Fill(input[i], input[i + 1]);
 
  423       return (
long)hist.GetEntries();
 
  427 template <
typename T>
 
  430    constexpr 
static unsigned short kNDim = 1;
 
  431    using HistType_t = 
typename Redirect<kNDim, T>::HistType_t;
 
  433    using FillFunc_t = std::add_pointer_t<long(HistType_t &hist, std::vector<double> &input, std::string_view type)>;
 
  437       static constexpr 
const char *
const gType = 
"regular bin size  ";
 
  439       template <FillFunc_t filler>
 
  440       static long Execute(std::vector<double> &input, 
double minVal, 
double maxVal)
 
  444          for (
unsigned short i = 0; i < gRepeat; ++i) {
 
  445             HistType_t hist(
"a", 
"a hist", 100, minVal, maxVal);
 
  446             result += filler(hist, input, gType);
 
  454       static constexpr 
const char *
const gType = 
"irregular bin size";
 
  456       template <FillFunc_t filler>
 
  457       static long Execute(std::vector<double> &input, 
double minVal, 
double maxVal)
 
  460          BinEdges edges(minVal, maxVal);
 
  461          for (
unsigned short i = 0; i < gRepeat; ++i) {
 
  462             HistType_t hist(
"a", 
"a hist", edges.fNBinsX - 1, edges.fXBins);
 
  463             result += filler(hist, input, gType);
 
  469    static long fillBuffered(HistType_t &hist, std::vector<double> &input, std::string_view gType)
 
  471       std::string title = MakeTitle(gVersion, GetHist<kNDim, T>(), 
"fills (buffered)   ", gType);
 
  472       hist.SetBuffer(TH1::GetDefaultBufferSize());
 
  475          Timer t(title.c_str(), input.size());
 
  476          for (
size_t i = 0; i < input.size() - 1; ++i)
 
  479       return (
long)hist.GetEntries();
 
  482    static long fillN(HistType_t &hist, std::vector<double> &input, std::string_view gType)
 
  484       std::string title = MakeTitle(gVersion, GetHist<kNDim, T>(), 
"fills N (stride 32)", gType);
 
  485       constexpr 
size_t stride = gStride;
 
  488          Timer t(title.c_str(), input.size());
 
  489          for (
size_t i = 0; i < (input.size() - (stride - 1)); i += (stride))
 
  490             hist.FillN(gStride, &(input[i]), 
nullptr);
 
  492       return (
long)hist.GetEntries();
 
  495    static long fill(HistType_t &hist, std::vector<double> &input, std::string_view gType)
 
  497       std::string title = MakeTitle(gVersion, GetHist<kNDim, T>(), 
"fills              ", gType);
 
  500          Timer t(title.c_str(), input.size());
 
  501          for (
size_t i = 0; i < input.size(); ++i)
 
  504       return (
long)hist.GetEntries();
 
  509 template <
typename T, 
unsigned short kNDim>
 
  510 void speedtest(
size_t count = (
size_t)(1e6));
 
  513 void speedtest<double, 2>(
size_t count)
 
  515    using DataType_t = double;
 
  516    static constexpr 
unsigned short kNDim = 2;
 
  518    TH1::AddDirectory(kFALSE);
 
  520    std::vector<double> input; 
 
  523    double minVal = -5.0;
 
  524    double maxVal = +5.0;
 
  525    GenerateInput(input, minVal, maxVal, 0);
 
  533    R7::Dim<DataType_t, kNDim>::EE::Execute<R7::Dim<DataType_t, kNDim>::fillBuffered>(input, minVal, maxVal);
 
  534    R7::Dim<DataType_t, kNDim>::EE::Execute<R7::Dim<DataType_t, kNDim>::fillBuffered>(input, minVal, maxVal);
 
  535    R7::Dim<DataType_t, kNDim>::EE::Execute<R7::Dim<DataType_t, kNDim>::fillN>(input, minVal, maxVal);
 
  536    R7::Dim<DataType_t, kNDim>::EE::Execute<R7::Dim<DataType_t, kNDim>::fillN>(input, minVal, maxVal);
 
  537    R7::Dim<DataType_t, kNDim>::EE::Execute<R7::Dim<DataType_t, kNDim>::fill>(input, minVal, maxVal);
 
  538    R7::Dim<DataType_t, kNDim>::EE::Execute<R7::Dim<DataType_t, kNDim>::fill>(input, minVal, maxVal);
 
  542    R7::Dim<DataType_t, kNDim>::II::Execute<R7::Dim<DataType_t, kNDim>::fillBuffered>(input, minVal, maxVal);
 
  543    R7::Dim<DataType_t, kNDim>::II::Execute<R7::Dim<DataType_t, kNDim>::fillBuffered>(input, minVal, maxVal);
 
  544    R7::Dim<DataType_t, kNDim>::II::Execute<R7::Dim<DataType_t, kNDim>::fillN>(input, minVal, maxVal);
 
  545    R7::Dim<DataType_t, kNDim>::II::Execute<R7::Dim<DataType_t, kNDim>::fillN>(input, minVal, maxVal);
 
  546    R7::Dim<DataType_t, kNDim>::II::Execute<R7::Dim<DataType_t, kNDim>::fill>(input, minVal, maxVal);
 
  547    R7::Dim<DataType_t, kNDim>::II::Execute<R7::Dim<DataType_t, kNDim>::fill>(input, minVal, maxVal);
 
  551    R6::Dim<DataType_t, kNDim>::EE::Execute<R6::Dim<DataType_t, kNDim>::fillBuffered>(input, minVal, maxVal);
 
  552    R6::Dim<DataType_t, kNDim>::EE::Execute<R6::Dim<DataType_t, kNDim>::fillBuffered>(input, minVal, maxVal);
 
  553    R6::Dim<DataType_t, kNDim>::EE::Execute<R6::Dim<DataType_t, kNDim>::fillN>(input, minVal, maxVal);
 
  554    R6::Dim<DataType_t, kNDim>::EE::Execute<R6::Dim<DataType_t, kNDim>::fillN>(input, minVal, maxVal);
 
  555    R6::Dim<DataType_t, kNDim>::EE::Execute<R6::Dim<DataType_t, kNDim>::fill>(input, minVal, maxVal);
 
  556    R6::Dim<DataType_t, kNDim>::EE::Execute<R6::Dim<DataType_t, kNDim>::fill>(input, minVal, maxVal);
 
  560    R6::Dim<DataType_t, kNDim>::II::Execute<R6::Dim<DataType_t, kNDim>::fillBuffered>(input, minVal, maxVal);
 
  561    R6::Dim<DataType_t, kNDim>::II::Execute<R6::Dim<DataType_t, kNDim>::fillBuffered>(input, minVal, maxVal);
 
  562    R6::Dim<DataType_t, kNDim>::II::Execute<R6::Dim<DataType_t, kNDim>::fillN>(input, minVal, maxVal);
 
  563    R6::Dim<DataType_t, kNDim>::II::Execute<R6::Dim<DataType_t, kNDim>::fillN>(input, minVal, maxVal);
 
  564    R6::Dim<DataType_t, kNDim>::II::Execute<R6::Dim<DataType_t, kNDim>::fill>(input, minVal, maxVal);
 
  565    R6::Dim<DataType_t, kNDim>::II::Execute<R6::Dim<DataType_t, kNDim>::fill>(input, minVal, maxVal);
 
  573 void speedtest<float, 2>(
size_t count)
 
  575    using DataType_t = float;
 
  576    constexpr 
unsigned short kNDim = 2;
 
  578    TH1::AddDirectory(kFALSE);
 
  580    std::vector<double> input; 
 
  583    double minVal = -5.0;
 
  584    double maxVal = +5.0;
 
  585    GenerateInput(input, minVal, maxVal, 0);
 
  593    R7::Dim<DataType_t, kNDim>::EE::Execute<R7::Dim<DataType_t, kNDim>::fillBuffered>(input, minVal, maxVal);
 
  594    R7::Dim<DataType_t, kNDim>::EE::Execute<R7::Dim<DataType_t, kNDim>::fillBuffered>(input, minVal, maxVal);
 
  595    R7::Dim<DataType_t, kNDim>::EE::Execute<R7::Dim<DataType_t, kNDim>::fillN>(input, minVal, maxVal);
 
  596    R7::Dim<DataType_t, kNDim>::EE::Execute<R7::Dim<DataType_t, kNDim>::fillN>(input, minVal, maxVal);
 
  597    R7::Dim<DataType_t, kNDim>::EE::Execute<R7::Dim<DataType_t, kNDim>::fill>(input, minVal, maxVal);
 
  598    R7::Dim<DataType_t, kNDim>::EE::Execute<R7::Dim<DataType_t, kNDim>::fill>(input, minVal, maxVal);
 
  602    R7::Dim<DataType_t, kNDim>::II::Execute<R7::Dim<DataType_t, kNDim>::fillBuffered>(input, minVal, maxVal);
 
  603    R7::Dim<DataType_t, kNDim>::II::Execute<R7::Dim<DataType_t, kNDim>::fillBuffered>(input, minVal, maxVal);
 
  604    R7::Dim<DataType_t, kNDim>::II::Execute<R7::Dim<DataType_t, kNDim>::fillN>(input, minVal, maxVal);
 
  605    R7::Dim<DataType_t, kNDim>::II::Execute<R7::Dim<DataType_t, kNDim>::fillN>(input, minVal, maxVal);
 
  606    R7::Dim<DataType_t, kNDim>::II::Execute<R7::Dim<DataType_t, kNDim>::fill>(input, minVal, maxVal);
 
  607    R7::Dim<DataType_t, kNDim>::II::Execute<R7::Dim<DataType_t, kNDim>::fill>(input, minVal, maxVal);
 
  611    R6::Dim<DataType_t, kNDim>::EE::Execute<R6::Dim<DataType_t, kNDim>::fillBuffered>(input, minVal, maxVal);
 
  612    R6::Dim<DataType_t, kNDim>::EE::Execute<R6::Dim<DataType_t, kNDim>::fillBuffered>(input, minVal, maxVal);
 
  613    R6::Dim<DataType_t, kNDim>::EE::Execute<R6::Dim<DataType_t, kNDim>::fillN>(input, minVal, maxVal);
 
  614    R6::Dim<DataType_t, kNDim>::EE::Execute<R6::Dim<DataType_t, kNDim>::fillN>(input, minVal, maxVal);
 
  615    R6::Dim<DataType_t, kNDim>::EE::Execute<R6::Dim<DataType_t, kNDim>::fill>(input, minVal, maxVal);
 
  616    R6::Dim<DataType_t, kNDim>::EE::Execute<R6::Dim<DataType_t, kNDim>::fill>(input, minVal, maxVal);
 
  620    R6::Dim<DataType_t, kNDim>::II::Execute<R6::Dim<DataType_t, kNDim>::fillBuffered>(input, minVal, maxVal);
 
  621    R6::Dim<DataType_t, kNDim>::II::Execute<R6::Dim<DataType_t, kNDim>::fillBuffered>(input, minVal, maxVal);
 
  622    R6::Dim<DataType_t, kNDim>::II::Execute<R6::Dim<DataType_t, kNDim>::fillN>(input, minVal, maxVal);
 
  623    R6::Dim<DataType_t, kNDim>::II::Execute<R6::Dim<DataType_t, kNDim>::fillN>(input, minVal, maxVal);
 
  624    R6::Dim<DataType_t, kNDim>::II::Execute<R6::Dim<DataType_t, kNDim>::fill>(input, minVal, maxVal);
 
  625    R6::Dim<DataType_t, kNDim>::II::Execute<R6::Dim<DataType_t, kNDim>::fill>(input, minVal, maxVal);
 
  629 void speedtest<double, 1>(
size_t count)
 
  631    using DataType_t = double;
 
  632    static constexpr 
unsigned short kNDim = 1;
 
  634    TH1::AddDirectory(kFALSE);
 
  636    std::vector<double> input; 
 
  639    double minVal = -5.0;
 
  640    double maxVal = +5.0;
 
  641    GenerateInput(input, minVal, maxVal, 0);
 
  649    R7::Dim<DataType_t, kNDim>::EE::Execute<R7::Dim<DataType_t, kNDim>::fillBuffered>(input, minVal, maxVal);
 
  650    R7::Dim<DataType_t, kNDim>::EE::Execute<R7::Dim<DataType_t, kNDim>::fillBuffered>(input, minVal, maxVal);
 
  651    R7::Dim<DataType_t, kNDim>::EE::Execute<R7::Dim<DataType_t, kNDim>::fillN>(input, minVal, maxVal);
 
  652    R7::Dim<DataType_t, kNDim>::EE::Execute<R7::Dim<DataType_t, kNDim>::fillN>(input, minVal, maxVal);
 
  653    R7::Dim<DataType_t, kNDim>::EE::Execute<R7::Dim<DataType_t, kNDim>::fill>(input, minVal, maxVal);
 
  654    R7::Dim<DataType_t, kNDim>::EE::Execute<R7::Dim<DataType_t, kNDim>::fill>(input, minVal, maxVal);
 
  658    R7::Dim<DataType_t, kNDim>::II::Execute<R7::Dim<DataType_t, kNDim>::fillBuffered>(input, minVal, maxVal);
 
  659    R7::Dim<DataType_t, kNDim>::II::Execute<R7::Dim<DataType_t, kNDim>::fillBuffered>(input, minVal, maxVal);
 
  660    R7::Dim<DataType_t, kNDim>::II::Execute<R7::Dim<DataType_t, kNDim>::fillN>(input, minVal, maxVal);
 
  661    R7::Dim<DataType_t, kNDim>::II::Execute<R7::Dim<DataType_t, kNDim>::fillN>(input, minVal, maxVal);
 
  662    R7::Dim<DataType_t, kNDim>::II::Execute<R7::Dim<DataType_t, kNDim>::fill>(input, minVal, maxVal);
 
  663    R7::Dim<DataType_t, kNDim>::II::Execute<R7::Dim<DataType_t, kNDim>::fill>(input, minVal, maxVal);
 
  667    R6::Dim<DataType_t, kNDim>::EE::Execute<R6::Dim<DataType_t, kNDim>::fillBuffered>(input, minVal, maxVal);
 
  668    R6::Dim<DataType_t, kNDim>::EE::Execute<R6::Dim<DataType_t, kNDim>::fillBuffered>(input, minVal, maxVal);
 
  669    R6::Dim<DataType_t, kNDim>::EE::Execute<R6::Dim<DataType_t, kNDim>::fillN>(input, minVal, maxVal);
 
  670    R6::Dim<DataType_t, kNDim>::EE::Execute<R6::Dim<DataType_t, kNDim>::fillN>(input, minVal, maxVal);
 
  671    R6::Dim<DataType_t, kNDim>::EE::Execute<R6::Dim<DataType_t, kNDim>::fill>(input, minVal, maxVal);
 
  672    R6::Dim<DataType_t, kNDim>::EE::Execute<R6::Dim<DataType_t, kNDim>::fill>(input, minVal, maxVal);
 
  676    R6::Dim<DataType_t, kNDim>::II::Execute<R6::Dim<DataType_t, kNDim>::fillBuffered>(input, minVal, maxVal);
 
  677    R6::Dim<DataType_t, kNDim>::II::Execute<R6::Dim<DataType_t, kNDim>::fillBuffered>(input, minVal, maxVal);
 
  678    R6::Dim<DataType_t, kNDim>::II::Execute<R6::Dim<DataType_t, kNDim>::fillN>(input, minVal, maxVal);
 
  679    R6::Dim<DataType_t, kNDim>::II::Execute<R6::Dim<DataType_t, kNDim>::fillN>(input, minVal, maxVal);
 
  680    R6::Dim<DataType_t, kNDim>::II::Execute<R6::Dim<DataType_t, kNDim>::fill>(input, minVal, maxVal);
 
  681    R6::Dim<DataType_t, kNDim>::II::Execute<R6::Dim<DataType_t, kNDim>::fill>(input, minVal, maxVal);
 
  685 void speedtest<float, 1>(
size_t count)
 
  687    using DataType_t = float;
 
  688    static constexpr 
unsigned short kNDim = 1;
 
  690    TH1::AddDirectory(kFALSE);
 
  692    std::vector<double> input; 
 
  695    double minVal = -5.0;
 
  696    double maxVal = +5.0;
 
  697    GenerateInput(input, minVal, maxVal, 0);
 
  705    R7::Dim<DataType_t, kNDim>::EE::Execute<R7::Dim<DataType_t, kNDim>::fillBuffered>(input, minVal, maxVal);
 
  706    R7::Dim<DataType_t, kNDim>::EE::Execute<R7::Dim<DataType_t, kNDim>::fillBuffered>(input, minVal, maxVal);
 
  707    R7::Dim<DataType_t, kNDim>::EE::Execute<R7::Dim<DataType_t, kNDim>::fillN>(input, minVal, maxVal);
 
  708    R7::Dim<DataType_t, kNDim>::EE::Execute<R7::Dim<DataType_t, kNDim>::fillN>(input, minVal, maxVal);
 
  709    R7::Dim<DataType_t, kNDim>::EE::Execute<R7::Dim<DataType_t, kNDim>::fill>(input, minVal, maxVal);
 
  710    R7::Dim<DataType_t, kNDim>::EE::Execute<R7::Dim<DataType_t, kNDim>::fill>(input, minVal, maxVal);
 
  714    R7::Dim<DataType_t, kNDim>::II::Execute<R7::Dim<DataType_t, kNDim>::fillBuffered>(input, minVal, maxVal);
 
  715    R7::Dim<DataType_t, kNDim>::II::Execute<R7::Dim<DataType_t, kNDim>::fillBuffered>(input, minVal, maxVal);
 
  716    R7::Dim<DataType_t, kNDim>::II::Execute<R7::Dim<DataType_t, kNDim>::fillN>(input, minVal, maxVal);
 
  717    R7::Dim<DataType_t, kNDim>::II::Execute<R7::Dim<DataType_t, kNDim>::fillN>(input, minVal, maxVal);
 
  718    R7::Dim<DataType_t, kNDim>::II::Execute<R7::Dim<DataType_t, kNDim>::fill>(input, minVal, maxVal);
 
  719    R7::Dim<DataType_t, kNDim>::II::Execute<R7::Dim<DataType_t, kNDim>::fill>(input, minVal, maxVal);
 
  723    R6::Dim<DataType_t, kNDim>::EE::Execute<R6::Dim<DataType_t, kNDim>::fillBuffered>(input, minVal, maxVal);
 
  724    R6::Dim<DataType_t, kNDim>::EE::Execute<R6::Dim<DataType_t, kNDim>::fillBuffered>(input, minVal, maxVal);
 
  725    R6::Dim<DataType_t, kNDim>::EE::Execute<R6::Dim<DataType_t, kNDim>::fillN>(input, minVal, maxVal);
 
  726    R6::Dim<DataType_t, kNDim>::EE::Execute<R6::Dim<DataType_t, kNDim>::fillN>(input, minVal, maxVal);
 
  727    R6::Dim<DataType_t, kNDim>::EE::Execute<R6::Dim<DataType_t, kNDim>::fill>(input, minVal, maxVal);
 
  728    R6::Dim<DataType_t, kNDim>::EE::Execute<R6::Dim<DataType_t, kNDim>::fill>(input, minVal, maxVal);
 
  732    R6::Dim<DataType_t, kNDim>::II::Execute<R6::Dim<DataType_t, kNDim>::fillBuffered>(input, minVal, maxVal);
 
  733    R6::Dim<DataType_t, kNDim>::II::Execute<R6::Dim<DataType_t, kNDim>::fillBuffered>(input, minVal, maxVal);
 
  734    R6::Dim<DataType_t, kNDim>::II::Execute<R6::Dim<DataType_t, kNDim>::fillN>(input, minVal, maxVal);
 
  735    R6::Dim<DataType_t, kNDim>::II::Execute<R6::Dim<DataType_t, kNDim>::fillN>(input, minVal, maxVal);
 
  736    R6::Dim<DataType_t, kNDim>::II::Execute<R6::Dim<DataType_t, kNDim>::fill>(input, minVal, maxVal);
 
  737    R6::Dim<DataType_t, kNDim>::II::Execute<R6::Dim<DataType_t, kNDim>::fill>(input, minVal, maxVal);
 
  740 void histspeedtest(
size_t iter = 1e6, 
int what = 255)
 
  743       speedtest<double, 2>(iter);
 
  745       speedtest<float, 2>(iter);
 
  747       speedtest<double, 1>(iter);
 
  749       speedtest<float, 1>(iter);
 
  752 int main(
int argc, 
char **argv)
 
  756    int what = 1 | 2 | 4 | 8;
 
  758       iter = atof(argv[1]);
 
  760       what = atoi(argv[2]);
 
  762    histspeedtest(iter, what);