fork download
  1.  
  2. #ifdef NDEBUG
  3. #undef NDEBUG
  4. #endif
  5. #include <cassert>
  6. #include <chrono>
  7. #include <functional>
  8. #include <iostream>
  9. #include <vector>
  10.  
  11. typedef unsigned long long Integer;
  12.  
  13. struct Functor
  14. {
  15. void operator()(Integer i, Integer &sum) const
  16. {
  17. sum += i;
  18. if ( i > 0 )
  19. {
  20. this->operator()(i - 1, sum);
  21. }
  22. }
  23. };
  24.  
  25. void recurse(Integer i, Integer& sum)
  26. {
  27. sum += i;
  28. if ( i > 0 )
  29. {
  30. recurse(i - 1, sum);
  31. }
  32. }
  33.  
  34. int main()
  35. {
  36. const Integer n(1000ull * 1000ull);
  37. const auto t_0(std::chrono::high_resolution_clock::now());
  38. Integer sum(0);
  39. recurse(n, sum);
  40. const auto t_1(std::chrono::high_resolution_clock::now());
  41. std::function<void(Integer, Integer&)> lambda_recurse([&lambda_recurse](Integer i, Integer& l_sum)
  42. {
  43. l_sum += i;
  44. if ( i > 0 )
  45. {
  46. lambda_recurse(i - 1, l_sum);
  47. }
  48. });
  49. Integer lambda_sum(0);
  50. lambda_recurse(n, lambda_sum);
  51. const auto t_2(std::chrono::high_resolution_clock::now());
  52. Integer functor_sum(0);
  53. Functor functor;
  54. functor(n, functor_sum);
  55. const auto t_3(std::chrono::high_resolution_clock::now());
  56. assert ( sum == lambda_sum );
  57. assert ( sum == functor_sum );
  58. std::cout << std::chrono::duration_cast<std::chrono::nanoseconds>(t_1 - t_0).count() << "\n";
  59. std::cout << std::chrono::duration_cast<std::chrono::nanoseconds>(t_2 - t_1).count() << "\n";
  60. std::cout << std::chrono::duration_cast<std::chrono::nanoseconds>(t_3 - t_2).count() << "\n";
  61. }
Success #stdin #stdout 0.01s 2984KB
stdin
Standard input is empty
stdout
0
9368000
0