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