arithmetic_perf.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. // Copyright (C) 2016-2018 T. Zachary Laine
  2. //
  3. // Distributed under the Boost Software License, Version 1.0. (See
  4. // accompanying file LICENSE_1_0.txt or copy at
  5. // http://www.boost.org/LICENSE_1_0.txt)
  6. #include <boost/yap/expression.hpp>
  7. #include <chrono>
  8. #include <iostream>
  9. #include <benchmark/benchmark.h>
  10. template<typename T>
  11. using term = boost::yap::terminal<boost::yap::expression, T>;
  12. namespace yap = boost::yap;
  13. namespace bh = boost::hana;
  14. //[ arithmetic_perf_decls
  15. namespace user {
  16. struct number
  17. {
  18. double value;
  19. friend number operator+(number lhs, number rhs)
  20. {
  21. return number{lhs.value + rhs.value};
  22. }
  23. friend number operator*(number lhs, number rhs)
  24. {
  25. return number{lhs.value * rhs.value};
  26. }
  27. };
  28. }
  29. //]
  30. double get_noise()
  31. {
  32. auto const start_time = std::chrono::high_resolution_clock::now();
  33. auto const start_time_ns =
  34. std::chrono::time_point_cast<std::chrono::nanoseconds>(start_time);
  35. return 1.0 * start_time_ns.time_since_epoch().count();
  36. }
  37. user::number g_a{get_noise()};
  38. user::number g_x{get_noise()};
  39. user::number g_y{get_noise()};
  40. //[ arithmetic_perf_eval_as_yap_expr
  41. user::number eval_as_yap_expr(user::number a_, user::number x_, user::number y_)
  42. {
  43. term<user::number> a{{a_}};
  44. term<user::number> x{{x_}};
  45. term<user::number> y{{y_}};
  46. auto expr = (a * x + y) * (a * x + y) + (a * x + y);
  47. return yap::evaluate(expr);
  48. }
  49. //]
  50. void BM_eval_as_yap_expr(benchmark::State & state)
  51. {
  52. double d = 0;
  53. while (state.KeepRunning()) {
  54. user::number const n = eval_as_yap_expr(g_a, g_x, g_y);
  55. d += n.value;
  56. }
  57. std::cout << "Sum of doubles=" << d << "\n";
  58. }
  59. //[ arithmetic_perf_eval_as_yap_expr_4x
  60. user::number
  61. eval_as_yap_expr_4x(user::number a_, user::number x_, user::number y_)
  62. {
  63. term<user::number> a{{a_}};
  64. term<user::number> x{{x_}};
  65. term<user::number> y{{y_}};
  66. auto expr = (a * x + y) * (a * x + y) + (a * x + y) +
  67. (a * x + y) * (a * x + y) + (a * x + y) +
  68. (a * x + y) * (a * x + y) + (a * x + y) +
  69. (a * x + y) * (a * x + y) + (a * x + y);
  70. return yap::evaluate(expr);
  71. }
  72. //]
  73. void BM_eval_as_yap_expr_4x(benchmark::State & state)
  74. {
  75. double d = 0;
  76. while (state.KeepRunning()) {
  77. user::number const n = eval_as_yap_expr_4x(g_a, g_x, g_y);
  78. d += n.value;
  79. }
  80. std::cout << "Sum of doubles=" << d << "\n";
  81. }
  82. //[ arithmetic_perf_eval_as_cpp_expr
  83. user::number eval_as_cpp_expr(user::number a, user::number x, user::number y)
  84. {
  85. return (a * x + y) * (a * x + y) + (a * x + y);
  86. }
  87. //]
  88. void BM_eval_as_cpp_expr(benchmark::State & state)
  89. {
  90. double d = 0;
  91. while (state.KeepRunning()) {
  92. user::number const n = eval_as_cpp_expr(g_a, g_x, g_y);
  93. d += n.value;
  94. }
  95. std::cout << "Sum of doubles=" << d << "\n";
  96. }
  97. //[ arithmetic_perf_eval_as_cpp_expr_4x
  98. user::number eval_as_cpp_expr_4x(user::number a, user::number x, user::number y)
  99. {
  100. return (a * x + y) * (a * x + y) + (a * x + y) + (a * x + y) * (a * x + y) +
  101. (a * x + y) + (a * x + y) * (a * x + y) + (a * x + y) +
  102. (a * x + y) * (a * x + y) + (a * x + y);
  103. }
  104. //]
  105. void BM_eval_as_cpp_expr_4x(benchmark::State & state)
  106. {
  107. double d = 0;
  108. while (state.KeepRunning()) {
  109. user::number const n = eval_as_cpp_expr_4x(g_a, g_x, g_y);
  110. d += n.value;
  111. }
  112. std::cout << "Sum of doubles=" << d << "\n";
  113. }
  114. BENCHMARK(BM_eval_as_yap_expr);
  115. BENCHMARK(BM_eval_as_yap_expr_4x);
  116. BENCHMARK(BM_eval_as_cpp_expr);
  117. BENCHMARK(BM_eval_as_cpp_expr_4x);
  118. BENCHMARK_MAIN()