Mesures – Test 2.0

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 <random>
#include <chrono>
#include <iterator>
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 };
   }
namespace {
   mt19937 gen{ random_device{}() };
   uniform_int_distribution<int> d2{ 0, 1 };
}
class Entite {
   bool actif;
public:
   Entite() noexcept : actif{ d2(gen)!=0 } {
   }
   bool est_inactive() const noexcept {
      return !actif;
   }
};
template <class It>
   auto compter_inactifs_manuel(It debut, It fin) {
      int inactifs = 0;
      for (; debut != fin; ++debut)
         if (debut->est_inactive())
            ++inactifs;
      return inactifs;
   }
template <class It>
   auto compter_inactifs_std(It debut, It fin) {
      return count_if(debut, fin, [](const Entite &e) { return e.est_inactive(); });
   }
int main() {
   enum { N = 50'000'000 };
   vector<Entite> v(N);
   auto [r0,dt0] = test([&v] { return compter_inactifs_manuel(begin(v), end(v));  });
   auto [r1,dt1] = test([&v] { return compter_inactifs_std(begin(v), end(v));  });
   cout << "Compatibilite manuelle, nb d'inactifs sur " << N << " elements: "
        << r0 << "\n\ttemps requis : "
        << duration_cast<milliseconds>(dt0).count() << " ms." << endl;
   cout << "Compatibilite standard, nb d'inactifs sur " << N << " elements: "
        << r1 << "\n\ttemps 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)
Compatibilite manuelle
- nb d'inactifs sur 50000000 elements: 25001381
- temps requis : 117 ms.
Compatibilite standard
- nb d'inactifs sur 50000000 elements: 25001381
- temps requis : 116 ms.
Compatibilite manuelle
- nb d'inactifs sur 50000000 elements: 24997702
- temps requis : 30 ms.
Compatibilite standard
- nb d'inactifs sur 50000000 elements: 24997702
- temps requis : 30 ms.
Compatibilite manuelle
- nb d'inactifs sur 50000000 elements: 25002987
- temps requis : 32 ms.
Compatibilite standard
- nb d'inactifs sur 50000000 elements: 25002987
- temps requis : 32 ms.

Valid XHTML 1.0 Transitional

CSS Valide !