Mesures – Test 2.2

Cet exemple utilise une version simplifiée de la fonction de mesure de temps présentée dans ../Sujets/AuSecours/Mesurer-le-temps.html et compile avec C++ 17 (ce n'est pas essentiel, mais ça simplifie l'écriture).

#include <algorithm>
#include <vector>
#include <iostream>
#include <iterator>
#include <chrono>
#include <random>
#include <string>
#include <string_view>
using namespace std;
using namespace std::chrono;
template <class F, class ... Args>
   auto test(F f, Args &&... args) {
      auto pre = high_resolution_clock::now();
      auto res = f(std::forward<Args>(args)...);
      auto post = high_resolution_clock::now();
      return pair{ res, post - pre };
   }
class Entite {
   enum class Grade : char {
      NEOPHYTE, APPRENTI, ADEPTE, EXPERT, MAITRE
   };
   Grade grade_ = Grade::NEOPHYTE;
   string nom_;
public:
   Entite(string_view nom = "Joe Blo") : nom_{ nom } {
   }
   Grade grade() const noexcept {
      return grade_;
   }
   string nom() const {
      return nom_;
   }
   void renommer(const string &nom) {
      nom_ = nom;
   }
   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;
   }
   bool operator ==(const Entite &e) const {
      return grade() == e.grade() && nom() == e.nom();
   }
   friend bool operator==(const Entite &e, string_view s) {
      return e.nom() == s;
   }
   friend bool operator==(string_view s, const Entite &e) {
      return s == e.nom();
   }
};
template <class It>
   It trouver_entite_manuel(It debut, It fin, string_view s) {
      for (; debut != fin; ++debut)
         if (*debut == s)
            return debut;
      return fin;
   }
template <class It>
   It trouver_entite_std(It debut, It fin, string_view s) {
      return find(debut, fin, s);
   }
int main() {
   enum { N = 10'000'000 };
   vector<Entite> v(N);
   v.front().renommer("Fred");
   mt19937 rng(random_device{}());
   shuffle(begin(v), end(v), rng);
   auto [r0, dt0] = test([&v]{ return trouver_entite_manuel(begin(v), end(v), "Fred"); });
   auto [r1, dt1] = test([&v]{ return trouver_entite_std(begin(v), end(v), "Fred"); });
   cout << "Recherche manuelle sur " << N << " elements :\n"
        << "- position " << distance(r0, end(v)) << '\n'
        << "- temps requis : " << duration_cast<milliseconds>(dt0).count() << " ms." << endl;
   cout << "Recherche standard sur " << N << " elements :\n"
        << "- position " << distance(r1, end(v)) << '\n'
        << "- temps requis : " << duration_cast<milliseconds>(dt1).count() << " ms." << endl;
}

Quelques résultats suivent. Portez attention aux temps relatifs pour un même compilateur, mais ne comparez pas les compilateurs entre eux, car les exécutions sont faites sur des machines distinctes :

Wandbox (lien) Coliru (lien) Visual Studio 2019 (Release, 32 bits)
Recherche manuelle sur 10000000 elements :
- position 2372834
- temps requis : 373 ms.
Recherche standard sur 10000000 elements :
- position 2372834
- temps requis : 367 ms.
Recherche manuelle sur 10000000 elements :
- position 9886723
- temps requis : 1 ms.
Recherche standard sur 10000000 elements :
- position 9886723
- temps requis : 1 ms.
Recherche manuelle sur 10000000 elements :
- position 3393431
- temps requis : 32 ms.
Recherche standard sur 10000000 elements :
n- position 3393431
- temps requis : 30 ms.

Valid XHTML 1.0 Transitional

CSS Valide !