#include <iostream>
#include <chrono>
template<typename TimeT = std::chrono::milliseconds>
struct measure
{
template<typename F>
static typename TimeT::rep execution(F const &func)
{
auto start = std::chrono::system_clock::now();
func();
auto duration = std::chrono::duration_cast< TimeT>(
std::chrono::system_clock::now() - start);
return duration.count();
}
};
struct functor
{
int state;
functor(int state) : state(state) {}
void operator()() const
{
std::cout << "In functor run for ";
}
};
void func()
{
std::cout << "In function, run for " << std::endl;
}
int main()
{
int dummy(3);
std::cout << measure<>::execution( [&dummy]() {
dummy *= 2; // usage with lambdas
std::cout << "In lambda, run for ";
}) << std::endl;
std::cout << measure<>::execution(functor(dummy)) << std::endl;
std::cout << measure<>::execution(func);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y2hyb25vPgoKCnRlbXBsYXRlPHR5cGVuYW1lIFRpbWVUID0gc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcz4Kc3RydWN0IG1lYXN1cmUKewoJdGVtcGxhdGU8dHlwZW5hbWUgRj4KCXN0YXRpYyB0eXBlbmFtZSBUaW1lVDo6cmVwIGV4ZWN1dGlvbihGIGNvbnN0ICZmdW5jKQoJewoJCWF1dG8gc3RhcnQgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKTsKCQlmdW5jKCk7CgkJYXV0byBkdXJhdGlvbiA9IHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PCBUaW1lVD4oCgkJCXN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpIC0gc3RhcnQpOwoJCXJldHVybiBkdXJhdGlvbi5jb3VudCgpOwoJfQp9OwoKc3RydWN0IGZ1bmN0b3IKewoJaW50IHN0YXRlOwoJZnVuY3RvcihpbnQgc3RhdGUpIDogc3RhdGUoc3RhdGUpIHt9Cgl2b2lkIG9wZXJhdG9yKCkoKSBjb25zdAoJewoJCXN0ZDo6Y291dCA8PCAiSW4gZnVuY3RvciBydW4gZm9yICI7Cgl9Cn07Cgp2b2lkIGZ1bmMoKQp7CglzdGQ6OmNvdXQgPDwgIkluIGZ1bmN0aW9uLCBydW4gZm9yICIgPDwgc3RkOjplbmRsOwp9CgoKaW50IG1haW4oKSAKewoJaW50IGR1bW15KDMpOwoJCglzdGQ6OmNvdXQgPDwgbWVhc3VyZTw+OjpleGVjdXRpb24oIFsmZHVtbXldKCkgeyAgCgkJZHVtbXkgKj0gMjsgLy8gdXNhZ2Ugd2l0aCBsYW1iZGFzCgkJc3RkOjpjb3V0IDw8ICJJbiBsYW1iZGEsIHJ1biBmb3IgIjsKCQl9KSA8PCBzdGQ6OmVuZGw7CgkJCglzdGQ6OmNvdXQgPDwgbWVhc3VyZTw+OjpleGVjdXRpb24oZnVuY3RvcihkdW1teSkpIDw8IHN0ZDo6ZW5kbDsKCQoJc3RkOjpjb3V0IDw8IG1lYXN1cmU8Pjo6ZXhlY3V0aW9uKGZ1bmMpOwoJCglyZXR1cm4gMDsKfQ==