fork download
  1. #include <vector>
  2. #include <string>
  3. #include <algorithm>
  4. #include <iostream>
  5. #include <numeric>
  6. #include <chrono>
  7.  
  8. struct Point {
  9. double x = {}, y = {}, z = {};
  10. Point() = default;
  11. Point(double x, double y, double z) : x{ x }, y{ y }, z{ z } {
  12. }
  13. };
  14. int main() {
  15. using namespace std;
  16. using namespace std::chrono;
  17. // la destination: un vecteur
  18. enum { NTESTS = 50 };
  19. enum { NELEMS = 10'000'000 };
  20. milliseconds elapsed_push[NTESTS]{};
  21. vector<Point> v;
  22. v.reserve(NELEMS);
  23. for (int i = 0; i < NTESTS; ++i) {
  24. v.clear();
  25. auto avant = high_resolution_clock::now();
  26. for (int j = 0; j < NELEMS; ++j)
  27. v.push_back(Point{ 1.0, -1.0, 1.0 });
  28. auto apres = high_resolution_clock::now();
  29. elapsed_push[i] = duration_cast<milliseconds>(apres - avant);
  30. }
  31. milliseconds elapsed_emplace[NTESTS]{};
  32. for (int i = 0; i < NTESTS; ++i) {
  33. v.clear();
  34. auto avant = high_resolution_clock::now();
  35. for (int j = 0; j < NELEMS; ++j) {
  36. v.emplace_back(1.0, -1.0, 1.0);
  37. }
  38. auto apres = high_resolution_clock::now();
  39. elapsed_emplace[i] = duration_cast<milliseconds>(apres - avant);
  40. }
  41. sort(begin(elapsed_push), end(elapsed_push));
  42. auto moyenne_push = accumulate(begin(elapsed_push), end(elapsed_push), milliseconds{}) / static_cast<double>(NTESTS);
  43. auto moyenne_emplace = accumulate(begin(elapsed_emplace), end(elapsed_emplace), milliseconds{}) / static_cast<double>(NTESTS);
  44. cout << "Avec " << NTESTS << " tests de push_back() sur " << NELEMS << " elements:\n"
  45. << "\tmeilleur temps: " << elapsed_push[0].count() << " ms.\n"
  46. << "\tpire temps: " << elapsed_push[NTESTS - 1].count() << " ms.\n"
  47. << "\ttemps moyen: " << moyenne_push.count() << " ms.\n" << endl;
  48. sort(begin(elapsed_emplace), end(elapsed_emplace));
  49. cout << "Avec " << NTESTS << " tests de emplace() sur " << NELEMS << " elements:\n"
  50. << "\tmeilleur temps: " << elapsed_emplace[0].count() << " ms.\n"
  51. << "\tpire temps: " << elapsed_emplace[NTESTS - 1].count() << " ms.\n"
  52. << "\ttemps moyen: " << moyenne_emplace.count() << " ms.\n" << endl;
  53. cout << "Pour esssentiellement le meme travail,\n"
  54. << "emplace_back() requiert en moyenne "
  55. << moyenne_emplace / moyenne_push * 100.0
  56. << "% du temps requis par push_back()\n" << endl;
  57. }
  58.  
Success #stdin #stdout 3.63s 15240KB
stdin
Standard input is empty
stdout
Avec 50 tests de push_back() sur 10000000 elements:
	meilleur temps: 34 ms.
	pire temps: 63 ms.
	temps moyen: 36.76 ms.

Avec 50 tests de emplace() sur 10000000 elements:
	meilleur temps: 33 ms.
	pire temps: 40 ms.
	temps moyen: 34.94 ms.

Pour esssentiellement le meme travail,
emplace_back() requiert en moyenne 95.049% du temps requis par push_back()