#include <algorithm>
#include <chrono>
#include <functional>
#include <iostream>
#include <vector>
#include <cstdio>
using namespace std;
template <class Period = chrono::seconds::period, class Func, typename... Args>
double timeit(Func f, Args&&... args)
{
auto start = chrono::high_resolution_clock::now();
f(args...);
auto end = chrono::high_resolution_clock::now();
chrono::duration<double, Period> diff = end - start;
return diff.count();
}
template <class Period = chrono::seconds::period, typename ClassMemFn, typename
ClassInst, typename... Args>
double timeit(ClassMemFn f, ClassInst instance, Args&&... args)
{
auto start = chrono::high_resolution_clock::now();
(instance->*f)(args...);
auto end = chrono::high_resolution_clock::now();
chrono::duration<double, Period> diff = end - start;
return diff.count();
}
class Thingy
{
public:
size_t sum_to(int last)
{
for (int i = 0; i < last; i++) {
ints.push_back(i);
}
return accumulate(ints.begin(), ints.end(), 0);
}
private:
vector<int> ints;
};
void foo()
{
cout << "foo()\n";
}
int main()
{
auto t1 = timeit<std::milli>(foo);
printf("%.3fms\n", t1);
Thingy t;
size_t sum = 0;
auto t2 = timeit<std::micro>([&sum, &t]()
{
sum = t.sum_to(1000);
});
cout << "sum is " << sum << "\n";
printf("%.3fμs\n", t2);
auto t3 = timeit(&Thingy::sum_to, &t, 42);
printf("%.3fs\n", t3);
}