#include <vector>
#include <string>
#include <algorithm>
#include <iostream>
#include <numeric>
#include <chrono>
struct Point {
double x = {}, y = {}, z = {};
Point() = default;
Point(double x, double y, double z) : x{ x }, y{ y }, z{ z } {
}
};
int main() {
using namespace std;
using namespace std::chrono;
// la destination: un vecteur
enum { NTESTS = 50 };
enum { NELEMS = 10'000'000 };
milliseconds elapsed_push[NTESTS]{};
vector<Point> v;
v.reserve(NELEMS);
for (int i = 0; i < NTESTS; ++i) {
v.clear();
auto avant = high_resolution_clock::now();
for (int j = 0; j < NELEMS; ++j)
v.push_back(Point{ 1.0, -1.0, 1.0 });
auto apres = high_resolution_clock::now();
elapsed_push[i] = duration_cast<milliseconds>(apres - avant);
}
milliseconds elapsed_emplace[NTESTS]{};
for (int i = 0; i < NTESTS; ++i) {
v.clear();
auto avant = high_resolution_clock::now();
for (int j = 0; j < NELEMS; ++j) {
v.emplace_back(1.0, -1.0, 1.0);
}
auto apres = high_resolution_clock::now();
elapsed_emplace[i] = duration_cast<milliseconds>(apres - avant);
}
sort(begin(elapsed_push), end(elapsed_push));
auto moyenne_push = accumulate(begin(elapsed_push), end(elapsed_push), milliseconds{}) / static_cast<double>(NTESTS);
auto moyenne_emplace = accumulate(begin(elapsed_emplace), end(elapsed_emplace), milliseconds{}) / static_cast<double>(NTESTS);
cout << "Avec " << NTESTS << " tests de push_back() sur " << NELEMS << " elements:\n"
<< "\tmeilleur temps: " << elapsed_push[0].count() << " ms.\n"
<< "\tpire temps: " << elapsed_push[NTESTS - 1].count() << " ms.\n"
<< "\ttemps moyen: " << moyenne_push.count() << " ms.\n" << endl;
sort(begin(elapsed_emplace), end(elapsed_emplace));
cout << "Avec " << NTESTS << " tests de emplace() sur " << NELEMS << " elements:\n"
<< "\tmeilleur temps: " << elapsed_emplace[0].count() << " ms.\n"
<< "\tpire temps: " << elapsed_emplace[NTESTS - 1].count() << " ms.\n"
<< "\ttemps moyen: " << moyenne_emplace.count() << " ms.\n" << endl;
cout << "Pour esssentiellement le meme travail,\n"
<< "emplace_back() requiert en moyenne "
<< moyenne_emplace / moyenne_push * 100.0
<< "% du temps requis par push_back()\n" << endl;
}