#include <chrono>
#include <cstdlib>
#include <functional>
#include <iostream>
#include <vector>
typedef unsigned long long Integer;
struct Functor
{
void operator()(Integer i, Integer &sum) const
{
sum += std::rand();
if ( i > 0 )
{
this->operator()(i - 1, sum);
}
}
};
void recurse(Integer i, Integer& sum)
{
sum += std::rand();
if ( i > 0 )
{
recurse(i - 1, sum);
}
}
int main()
{
const Integer n(50ull * 1000ull * 1000ull);
const auto t_0(std::chrono::high_resolution_clock::now());
Integer functor_sum(0);
Functor functor;
functor(n, functor_sum);
const auto t_1(std::chrono::high_resolution_clock::now());
Integer sum(0);
recurse(n, sum);
const auto t_2(std::chrono::high_resolution_clock::now());
std::function<void(Integer, Integer&)> lambda_recurse([&lambda_recurse](Integer i, Integer& l_sum)
{
l_sum += std::rand();
if ( i > 0 )
{
lambda_recurse(i - 1, l_sum);
}
});
Integer lambda_sum(0);
lambda_recurse(n, lambda_sum);
const auto t_3(std::chrono::high_resolution_clock::now());
std::cout << "functor: " << std::chrono::duration_cast<std::chrono::milliseconds>(t_1 - t_0).count() << "\n";
std::cout << "plain: " << std::chrono::duration_cast<std::chrono::milliseconds>(t_2 - t_1).count() << "\n";
std::cout << "lambda: " << std::chrono::duration_cast<std::chrono::milliseconds>(t_3 - t_2).count() << "\n";
}
CiNpbmNsdWRlIDxjaHJvbm8+CiNpbmNsdWRlIDxjc3RkbGliPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgogCnR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIEludGVnZXI7CgpzdHJ1Y3QgRnVuY3Rvcgp7CiAgIHZvaWQgb3BlcmF0b3IoKShJbnRlZ2VyIGksIEludGVnZXIgJnN1bSkgY29uc3QKICAgewogICAgICBzdW0gKz0gc3RkOjpyYW5kKCk7CiAgICAgIGlmICggaSA+IDAgKQogICAgICB7CiAgICAgICAgIHRoaXMtPm9wZXJhdG9yKCkoaSAtIDEsIHN1bSk7CiAgICAgIH0KICAgfQp9OwoKdm9pZCByZWN1cnNlKEludGVnZXIgaSwgSW50ZWdlciYgc3VtKQp7CiAgIHN1bSArPSBzdGQ6OnJhbmQoKTsKICAgaWYgKCBpID4gMCApCiAgIHsKICAgICAgcmVjdXJzZShpIC0gMSwgc3VtKTsKICAgfQp9CiAKaW50IG1haW4oKQp7CiAgIGNvbnN0IEludGVnZXIgbig1MHVsbCAqIDEwMDB1bGwgKiAxMDAwdWxsKTsKICAgY29uc3QgYXV0byB0XzAoc3RkOjpjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCkpOwogICBJbnRlZ2VyIGZ1bmN0b3Jfc3VtKDApOwogICBGdW5jdG9yIGZ1bmN0b3I7CiAgIGZ1bmN0b3IobiwgZnVuY3Rvcl9zdW0pOwogICBjb25zdCBhdXRvIHRfMShzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKSk7CiAgIEludGVnZXIgc3VtKDApOwogICByZWN1cnNlKG4sIHN1bSk7CiAgIGNvbnN0IGF1dG8gdF8yKHN0ZDo6Y2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpKTsKICAgc3RkOjpmdW5jdGlvbjx2b2lkKEludGVnZXIsIEludGVnZXImKT4gbGFtYmRhX3JlY3Vyc2UoWyZsYW1iZGFfcmVjdXJzZV0oSW50ZWdlciBpLCBJbnRlZ2VyJiBsX3N1bSkKICAgewogICAgICBsX3N1bSArPSBzdGQ6OnJhbmQoKTsKICAgICAgaWYgKCBpID4gMCApCiAgICAgIHsKICAgICAgICAgbGFtYmRhX3JlY3Vyc2UoaSAtIDEsIGxfc3VtKTsKICAgICAgfQogICB9KTsKICAgSW50ZWdlciBsYW1iZGFfc3VtKDApOwogICBsYW1iZGFfcmVjdXJzZShuLCBsYW1iZGFfc3VtKTsKICAgY29uc3QgYXV0byB0XzMoc3RkOjpjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCkpOwogICBzdGQ6OmNvdXQgPDwgImZ1bmN0b3I6ICIgPDwgc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcz4odF8xIC0gdF8wKS5jb3VudCgpIDw8ICJcbiI7CiAgIHN0ZDo6Y291dCA8PCAicGxhaW46ICIgPDwgc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcz4odF8yIC0gdF8xKS5jb3VudCgpIDw8ICJcbiI7CiAgIHN0ZDo6Y291dCA8PCAibGFtYmRhOiAiIDw8IHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHM+KHRfMyAtIHRfMikuY291bnQoKSA8PCAiXG4iOwp9