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