#include <iostream>
#include <vector>
#include <list>
#include <unordered_map>
#include <chrono>
class StopWatch
{
typedef std::chrono::system_clock clock;
typedef clock::duration duration;
public:
void StartProcess(std::string const & name)
{
m_current_processes[name] = clock::now();
}
void StopProcess(std::string const & name)
{
auto stop = clock::now();
auto diff = stop - m_current_processes[name];
m_stopped_processes[name] = diff;
m_current_processes.erase(name);
}
void StopAllProcesses()
{
while (!m_current_processes.empty())
{
auto ip = m_current_processes.begin();
StopProcess(ip->first);
}
}
private:
std::unordered_map<std::string, clock::time_point> m_current_processes;
std::unordered_map<std::string, duration> m_stopped_processes;
friend std::ostream& operator<<(std::ostream& os, StopWatch const& sw);
};
inline std::ostream& operator<<(std::ostream& os, StopWatch const& sw)
{
for (auto & p : sw.m_stopped_processes)
{
using namespace std::chrono;
double seconds = nanoseconds(p.second).count() / 1000000000.0;
os << p.first << " : " << seconds << '\n';
}
return os;
}
int main()
{
const int num_elements = 10000000;
StopWatch w;
std::vector<int> v;
w.StartProcess("vector");
for (int i=0; i<num_elements; ++i)
{
v.push_back(i);
}
w.StopProcess("vector");
std::list<int> l;
w.StartProcess("list");
for (int i=0; i<num_elements; ++i)
{
l.push_back(i);
}
w.StopAllProcesses();
std::cout << w << '\n';
}