mirror of
https://github.com/boostorg/yap.git
synced 2026-02-21 15:42:10 +00:00
127 lines
3.1 KiB
C++
127 lines
3.1 KiB
C++
#define BOOST_YAP_CONVERSION_OPERATOR_TEMPLATE 1
|
|
#include <boost/yap/expression.hpp>
|
|
|
|
#include <chrono>
|
|
#include <iostream>
|
|
|
|
#include <benchmark/benchmark.h>
|
|
|
|
|
|
template <typename T>
|
|
using term = boost::yap::terminal<boost::yap::expression, T>;
|
|
|
|
namespace yap = boost::yap;
|
|
namespace bh = boost::hana;
|
|
|
|
|
|
namespace user {
|
|
|
|
struct number
|
|
{
|
|
double value;
|
|
|
|
friend number operator+ (number lhs, number rhs)
|
|
{ return number{lhs.value + rhs.value}; }
|
|
|
|
friend number operator* (number lhs, number rhs)
|
|
{ return number{lhs.value * rhs.value}; }
|
|
};
|
|
|
|
}
|
|
|
|
double get_noise ()
|
|
{
|
|
auto const start_time = std::chrono::high_resolution_clock::now();
|
|
auto const start_time_ns = std::chrono::time_point_cast<std::chrono::nanoseconds>(start_time);
|
|
return 1.0 * start_time_ns.time_since_epoch().count();
|
|
}
|
|
|
|
|
|
user::number g_a{get_noise()};
|
|
user::number g_x{get_noise()};
|
|
user::number g_y{get_noise()};
|
|
|
|
user::number eval_as_yap_expr (user::number a_, user::number x_, user::number y_)
|
|
{
|
|
term<user::number> a{{a_}};
|
|
term<user::number> x{{x_}};
|
|
term<user::number> y{{y_}};
|
|
auto expr = (a * x + y) * (a * x + y) + (a * x + y);
|
|
return expr;
|
|
}
|
|
|
|
void BM_eval_as_yap_expr (benchmark::State & state)
|
|
{
|
|
double d = 0;
|
|
while (state.KeepRunning()) {
|
|
user::number const n = eval_as_yap_expr(g_a, g_x, g_y);
|
|
d += n.value;
|
|
}
|
|
std::cout << "Sum of doubles=" << d << "\n";
|
|
}
|
|
|
|
user::number eval_as_yap_expr_4x (user::number a_, user::number x_, user::number y_)
|
|
{
|
|
term<user::number> a{{a_}};
|
|
term<user::number> x{{x_}};
|
|
term<user::number> y{{y_}};
|
|
auto expr =
|
|
(a * x + y) * (a * x + y) + (a * x + y) +
|
|
(a * x + y) * (a * x + y) + (a * x + y) +
|
|
(a * x + y) * (a * x + y) + (a * x + y) +
|
|
(a * x + y) * (a * x + y) + (a * x + y)
|
|
;
|
|
return expr;
|
|
}
|
|
|
|
void BM_eval_as_yap_expr_4x (benchmark::State & state)
|
|
{
|
|
double d = 0;
|
|
while (state.KeepRunning()) {
|
|
user::number const n = eval_as_yap_expr_4x(g_a, g_x, g_y);
|
|
d += n.value;
|
|
}
|
|
std::cout << "Sum of doubles=" << d << "\n";
|
|
}
|
|
|
|
user::number eval_as_cpp_expr (user::number a, user::number x, user::number y)
|
|
{
|
|
return (a * x + y) * (a * x + y) + (a * x + y);
|
|
}
|
|
|
|
void BM_eval_as_cpp_expr (benchmark::State & state)
|
|
{
|
|
double d = 0;
|
|
while (state.KeepRunning()) {
|
|
user::number const n = eval_as_cpp_expr(g_a, g_x, g_y);
|
|
d += n.value;
|
|
}
|
|
std::cout << "Sum of doubles=" << d << "\n";
|
|
}
|
|
|
|
user::number eval_as_cpp_expr_4x (user::number a, user::number x, user::number y)
|
|
{
|
|
return
|
|
(a * x + y) * (a * x + y) + (a * x + y) +
|
|
(a * x + y) * (a * x + y) + (a * x + y) +
|
|
(a * x + y) * (a * x + y) + (a * x + y) +
|
|
(a * x + y) * (a * x + y) + (a * x + y);
|
|
}
|
|
|
|
void BM_eval_as_cpp_expr_4x (benchmark::State & state)
|
|
{
|
|
double d = 0;
|
|
while (state.KeepRunning()) {
|
|
user::number const n = eval_as_cpp_expr_4x(g_a, g_x, g_y);
|
|
d += n.value;
|
|
}
|
|
std::cout << "Sum of doubles=" << d << "\n";
|
|
}
|
|
|
|
BENCHMARK(BM_eval_as_yap_expr);
|
|
BENCHMARK(BM_eval_as_yap_expr_4x);
|
|
BENCHMARK(BM_eval_as_cpp_expr);
|
|
BENCHMARK(BM_eval_as_cpp_expr_4x);
|
|
|
|
BENCHMARK_MAIN()
|