Mesures – Test 2.1

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>
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;
public:
   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 It>
   It trouver_expert_manuel(It debut, It fin) {
      for (; debut != fin; ++debut)
         if (debut->expert())
            return debut;
      return fin;
   }
template <class It>
   It trouver_expert_std(It debut, It fin) {
      return find_if(debut, fin, [](const Entite &e) { return e.expert(); });
   }
int main() {
   enum { N = 50'000'000 };
   vector<Entite> v(N);
   for (auto &e = v.front(); !e.expert(); e.promotion())
      ;
   mt19937 rng(random_device{}());
   shuffle(begin(v), end(v), rng);
   auto [r0, dt0] = test([&v]{ return trouver_expert_manuel(begin(v), end(v)); });
   auto [r1, dt1] = test([&v]{ return trouver_expert_std(begin(v), end(v)); });
   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 50000000 elements:
- position 27416788
- temps requis : 52 ms.
Recherche standard sur 50000000 elements:
- position 27416788
- temps requis : 46 ms.
Recherche manuelle sur 50000000 elements:
- position 46723340
- temps requis : 2 ms.
Recherche standard sur 50000000 elements:
- position 46723340
- temps requis : 1 ms.
Recherche manuelle sur 50000000 elements:
- position 27144175
- temps requis : 9 ms.
Recherche standard sur 50000000 elements:
- position 27144175
- temps requis : 9 ms.

Valid XHTML 1.0 Transitional

CSS Valide !