Mesures – Test 1.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 <vector>
#include <list>
#include <deque>
#include <iostream>
#include <algorithm>
#include <chrono>
#include <memory>
#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 };
   }
int main() {
   clog.rdbuf(nullptr); // trou noir
   enum { N = 10'000'000 };
   unique_ptr<int[]> tab{ new int[N] };
   mt19937 rng(random_device{}());
   uniform_int_distribution<int> distrib{ 1, 10 };
   generate(&tab[0], &tab[N], [&]{ return distrib(rng); });
   auto [r0, dt0] = test([&tab] {
      long somme = 0L;
      // Test sur le tableau (avec indices)
      for (int i = 0; i < N; ++i)
         somme += tab[i];
      return somme;
   });
   auto [r1, dt1] = test([&tab] {
      long somme = 0L;
      // Test sur le tableau (avec itérateurs)
      for (auto p = &tab[0]; p != &tab[N]; ++p)
         somme += *p;
      return somme;
   });
   auto [r2, dt2] = test([v = vector<int>(&tab[0], &tab[N])] {
      long somme = 0L;
      // Test sur un std::vector (avec itérateurs)
      for (int n : v)
         somme += n;
      return somme;
   });
   auto [r3, dt3] = test([lst = list<int>(&tab[0], &tab[N])] {
      long somme = 0L;
      // Test sur un std::list (avec itérateurs)
      for (int n : lst)
         somme += n;
      return somme;
   });
   auto [r4, dt4] = test([d = deque<int>(&tab[0], &tab[N])] {
      long somme = 0L;
      // Test sur un std::deque (avec itérateurs)
      for (int n : d)
         somme += n;
      return somme;
   });
   cout << "Resultats pour la somme de " << N << " elements (ms):\n"
        << "\ttableau (indices): " << duration_cast<milliseconds>(dt0).count() << " ms.\n"
        << "\ttableau (iterateurs): " << duration_cast<milliseconds>(dt1).count() << " ms.\n"
        << "\tvector: " << duration_cast<milliseconds>(dt2).count() << " ms.\n"
        << "\tlist: " << duration_cast<milliseconds>(dt3).count() << " ms.\n"
        << "\tdeque: " << duration_cast<milliseconds>(dt4).count() << " ms." <<  endl;
    clog << r0 << ' ' << r1 << ' ' << r2 << ' ' << r3 << ' ' << r4;
}

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)
Resultats pour la somme de 10000000 elements (ms):
	tableau (indices): 40 ms.
	tableau (iterateurs): 44 ms.
	vector: 40 ms.
	list: 584 ms.
	deque: 45 ms.
Resultats pour la somme de 10000000 elements (ms):
	tableau (indices): 10 ms.
	tableau (iterateurs): 10 ms.
	vector: 10 ms.
	list: 75 ms.
	deque: 11 ms.
Resultats pour la somme de 10000000 elements (ms):
        tableau (indices): 2 ms.
        tableau (iterateurs): 5 ms.
        vector: 2 ms.
        list: 40 ms.
        deque: 10 ms.

Valid XHTML 1.0 Transitional

CSS Valide !