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) |
---|---|---|
|
|
|