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 <iostream>
#include <vector>
#include <list>
#include <deque>
#include <string_view>
#include <chrono>
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 };
}
template <class C>
void test_insertion(string_view nom, int n) {
auto [r,dt] = test([conteneur = C{}, n]() mutable {
for (int i = 0; i < n; i++)
conteneur.insert(begin(conteneur), i+1);
return conteneur.back(); // pour éviter que l'optimiseur n'élimine tout
});
cout << '\t' << nom << " : "
<< duration_cast<milliseconds>(dt).count() << " ms." << endl;
}
int main() {
enum { N = 50'000 };
cout << "Resultats pour " << N << " insertions (ms):" << endl;
test_insertion<vector<int>>("vector", N);
test_insertion<deque<int>>("deque", N);
test_insertion<list<int>>("list", N);
}
Quelques résultats suivent. Notez que N est petit ici (si vous le souhaitez, ajoutez un zéro et faites le test sur votre ordinateur). 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) |
---|---|---|
|
|
|
À la lueur de ces résultats, vous comprendrez sans doute la raison pour laquelle push_front() n'est pas une opération offerte par std::vector : ce serait terriblement inefficace.