Mesures – Test 2.1

#include <algorithm>
#include <vector>
#include <iostream>
#include <iterator>
#include <chrono>
#include <random>
using namespace std;
using namespace std::chrono;
class Entite
{
   enum class Grade : char
   {
      NEOPHYTE, APPRENTI, ADEPTE, EXPERT, MAITRE
   };
   Grade grade_;
public:
   Entite() noexcept
      : grade_(Grade::NEOPHYTE)
   {
   }
   Grade grade() const noexcept
      { return grade_; }
   bool promotion() noexcept
   {
      if (grade() == Grade::MAITRE)
         return false;
      grade_ = static_cast<Grade>(static_cast<char>(grade()) + 1);
      return true;
   }
   bool expert() const noexcept
      { return grade() >= Grade::EXPERT; }
};
template <class Itt>
   Itt trouver_expert_manuel(Itt debut, Itt fin, system_clock::duration &temps)
   {
      auto avant = system_clock::now();
      for (; debut != fin; ++debut)
         if (debut->expert())
         {
            temps = system_clock::now() - avant;
            return debut;
         }
      temps = system_clock::now() - avant;
      return fin;
   }
template <class Itt>
   Itt trouver_expert_std(Itt debut, Itt fin, system_clock::duration &temps)
   {
      auto avant = system_clock::now();
      auto itt = find_if(debut, fin, [](const Entite &e) { return e.expert(); });
      temps = system_clock::now() - avant;
      return itt;
   }
int main()
{
   const int N = 50000000;
   vector<Entite> v(N);
   for (auto &e = v.front(); !e.expert(); e.promotion())
      ;
   random_device rd;
   mt19937 rng(rd());
   shuffle(begin(v), end(v), rng);
   {
      system_clock::duration t_man;
      auto itt = trouver_expert_manuel(begin(v), end(v), t_man);
      cout << "Recherche manuelle sur " << N << " elements: position "
            << distance(itt, end(v)) << ", temps requis: "
            << duration_cast<milliseconds>(t_man).count() << endl;
   }
   {
      system_clock::duration t_std;
      auto itt = trouver_expert_std(begin(v), end(v), t_std);
      cout << "Recherche standard sur " << N << " elements: position "
            << distance(itt, end(v)) << ", temps requis: "
            << duration_cast<milliseconds>(t_std).count() << endl;
   }
}

Sur mon petit ordinateur portatif, compilé avec Visual Studio 2013, configuration Release, et en prenant bien entendu soin d'ajouter _SECURE_SCL=0 aux options du préprocesseur pour désactiver les (franchement inutiles et nuisibles) Checked Iterators, j'obtiens :

Recherche manuelle sur 50000000 elements: position 31237878, temps requis: 12
Recherche standard sur 50000000 elements: position 31237878, temps requis: 12
Appuyez sur une touche pour continuer...

Valid XHTML 1.0 Transitional

CSS Valide !