Comparaison fonctions/ foncteurs

Ce comparatif a recours aux templates variadiques et au Perfect Forwarding pour la fonction de mesure.

#include <iostream>
#include <chrono>
#include <cmath>
#include <algorithm>
#include <vector>
#include <random>
#include <type_traits>
using namespace std;
using namespace std::chrono;

template <class F, class ... Args>
   auto tester(F f, Args &&... args) {
      auto pre = high_resolution_clock::now();
      auto res = f(std::forward<Args>(args)...);
      auto post = high_resolution_clock::now();
      return make_pair(res, post - pre);
   }

double racine_fonction(double x) {
   return sqrt(x);
}
struct racine_foncteur {
   double operator()(double x) const {
      return sqrt(x);
   }
};

class fonctions {
   vector<double> vals;
public:
   template <class It>
      fonctions(It debut, It fin) : vals(debut, fin) {
      }
   double operator()() {
      transform(begin(vals), end(vals), begin(vals), racine_fonction);
      return vals.back();
   }
};

class foncteurs {
   vector<double> vals;
public:
   template <class It>
      foncteurs(It debut, It fin) : vals(debut, fin) {
      }
   double operator()() {
      transform(begin(vals), end(vals), begin(vals), racine_foncteur{});
      return vals.back();
   }
};

int main() {
   enum { N = 50'000'000 };
   vector<double> vals(N);
   random_device rd;
   mt19937 prng{ rd() };
   uniform_real_distribution<> distrib; // 0.0 .. 1.0
   clog.rdbuf(nullptr);
   generate(begin(vals), end(vals), [&]() { return distrib(prng); });
   cout << "Test sur des fonctions..." << flush;
   auto r0 = tester(fonctions{ begin(vals), end(vals) });
   cout << "Temps ecoule : "
      << duration_cast<milliseconds>(r0.second).count() << " ms." << endl;
   cout << "Test sur des foncteurs..." << flush;
   auto r1 = tester(foncteurs{ begin(vals), end(vals) });
   cout << "Temps ecoule : "
        << duration_cast<milliseconds>(r1.second).count() << " ms." << endl;
   // « effet de bord » pour empêcher l'elimination des calculs
   clog << r0.first << ' ' << r1.first << endl;
}

Sur mon petit ordinateur portatif, compilé avec Visual Studio 2017.5, configuration Release, j'obtiens :

Test sur des fonctions...Temps ecoule : 204 ms.
Test sur des foncteurs...Temps ecoule : 143 ms.

Valid XHTML 1.0 Transitional

CSS Valide !