37 "((1.23 * x^2) / y) - 123.123",
38 "(y + x / y) * (x - y / x)",
39 "x / ((x + y) + (x - y)) / y",
40 "1 - ((x * y) + (y / x)) - 3",
41 "(5.5 + x) + (2 * x - 2 / 3 * y) * (x / 3 + y / 4) + (y + 7.7)",
42 "1.1x^1 + 2.2y^2 - 3.3x^3 + 4.4y^15 - 5.5x^23 + 6.6y^55",
43 "sin(2 * x) + cos(pi / y)",
44 "1 - sin(2 * x) + cos(pi / y)",
45 "sqrt(111.111 - sin(2 * x) + cos(pi / y) / 333.333)",
46 "(x^2 / sin(2 * pi / y)) - x / 2",
47 "x + (cos(y - sin(2 / x * pi)) - sin(x - cos(2 * y / pi))) - y",
48 "clamp(-1.0, sin(2 * pi * x) + cos(y / 2 * pi), +1.0)",
49 "max(3.33, min(sqrt(1 - sin(2 * x) + cos(pi / y) / 3), 1.11))",
50 "if((y + (x * 2.2)) <= (x + y + 1.1), x - y, x * y) + 2 * pi / x"
71 template <
typename,
typename>
class Sequence>
83 printf(
"[load_expression] - Parser Error: %s\tExpression: %s\n",
84 parser.
error().c_str(),
90 expr_seq.push_back(expression);
99 const std::string& expr_string)
102 unsigned int count = 0;
111 total += expression.
value();
119 printf(
"[exprtk] Total Time:%12.8f Rate:%14.3fevals/sec Expression: %s\n",
121 count / timer.
time(),
122 expr_string.c_str());
124 printf(
"run_exprtk_benchmark() - Error running benchmark for expression: %s\n",expr_string.c_str());
127template <
typename T>
struct native;
129template <
typename T,
typename NativeFunction>
133 unsigned int count = 0;
150 printf(
"[native] Total Time:%12.8f Rate:%14.3fevals/sec Expression: %s\n",
152 count / timer.
time(),
153 expr_string.c_str());
155 printf(
"run_native_benchmark() - Error running benchmark for expression: %s\n",expr_string.c_str());
161 static const std::size_t
rounds = 100000;
172 for (std::size_t r = 0; r <
rounds; ++r)
176 printf(
"[run_parse_benchmark] - Parser Error: %s\tExpression: %s\n",
177 parser.
error().c_str(),
186 printf(
"[parse] Total Time:%12.8f Rate:%14.3fparse/sec Expression: %s\n",
196const double pi_d = 3.14159265358979323846;
206 return (x + y) / T(2);
211 return ((v < l) ? l : ((v > u) ? u : v));
221 return T(2) * (y + x);
226 return (T(2) * y + T(2) * x);
231 return ((T(1.23) * (x * x)) / y) - T(123.123);
236 return (y + x / y) * (x - y / x);
241 return x / ((x + y) + (x - y)) / y;
246 return T(1) - ((x * y) + (y / x)) - T(3);
251 return (T(5.5) + x) + (T(2) * x - T(2) / T(3) * y) * (x / T(3) + y / T(4)) + (y + T(7.7));
257 return (T(1.1)*pow(x,T(1))+T(2.2)*pow(y,T(2))-T(3.3)*pow(x,T(3))+T(4.4)*pow(y,T(15))-T(5.5)*pow(x,T(23))+T(6.6)*pow(y,T(55)));
262 return std::sin(T(2) * x) + std::cos(
pi_d / y);
267 return T(1) - std::sin(T(2) * x) + std::cos(
pi_d / y);
272 return std::sqrt(T(111.111) - std::sin(T(2) * x) + std::cos(
pi_d / y) / T(333.333));
277 return ((x * x) / std::sin(T(2) *
pi_d / y)) - x / T(2);
282 return (x + (std::cos(y - std::sin(T(2) / x *
pi_d)) - std::sin(x - std::cos(T(2) * y /
pi_d))) - y);
287 return clamp(T(-1), std::sin(T(2) *
pi_d * x) + std::cos(y / T(2) *
pi_d), + T(1));
292 return std::max(T(3.33), std::min(sqrt(T(1) - std::sin(T(2) * x) + std::cos(
pi_d / y) / T(3)), T(1.11)));
297 return (((y + (x * T(2.2))) <= (x + y + T(1.1))) ? x - y : x * y) + T(2) *
pi_d / x;
304int main(
int argc,
char* argv[])
308 const std::string file_name = argv[1];
328 std::deque<exprtk::expression<real::type> > expr_list;
336 std::cout <<
"--- EXPRTK ---" << std::endl;
337 for (std::size_t i = 0; i < expr_list.size(); ++i)
344 std::cout <<
"--- NATIVE ---" << std::endl;
367 std::cout <<
"--- PARSE ----" << std::endl;
411 std::ifstream stream(file_name.c_str());
413 if (!stream)
return 0;
416 buffer.reserve(1024);
417 std::size_t line_count = 0;
419 while (std::getline(stream,buffer))
423 else if (
'#' == buffer[0])
435 std::deque<std::string> expr_str_list;
439 std::cout <<
"Failed to load any expressions from: " << file_name <<
"\n";
449 symbol_table_t symbol_table;
459 symbol_table.add_variable(
"a", a);
460 symbol_table.add_variable(
"b", b);
461 symbol_table.add_variable(
"c", c);
463 symbol_table.add_variable(
"x", x);
464 symbol_table.add_variable(
"y", y);
465 symbol_table.add_variable(
"z", z);
466 symbol_table.add_variable(
"w", w);
481 symbol_table.add_function(
"poly01", poly01);
482 symbol_table.add_function(
"poly02", poly02);
483 symbol_table.add_function(
"poly03", poly03);
484 symbol_table.add_function(
"poly04", poly04);
485 symbol_table.add_function(
"poly05", poly05);
486 symbol_table.add_function(
"poly06", poly06);
487 symbol_table.add_function(
"poly07", poly07);
488 symbol_table.add_function(
"poly08", poly08);
489 symbol_table.add_function(
"poly09", poly09);
490 symbol_table.add_function(
"poly10", poly10);
491 symbol_table.add_function(
"poly11", poly11);
492 symbol_table.add_function(
"poly12", poly12);
495 symbol_table.add_variable(
"e", e,
true);
497 symbol_table.add_constants();
502 for (std::size_t i = 0; i < expr_str_list.size(); ++i)
504 expression_t expression;
505 expression.register_symbol_table(symbol_table);
507 if (!parser.compile(expr_str_list[i],expression))
509 printf(
"[perform_file_based_benchmark] - Parser Error: %s\tExpression: %s\n",
510 parser.error().c_str(),
511 expr_str_list[i].c_str());
543 for (std::size_t r = 0; r <
rounds; ++r)
552 printf(
"Expression %3d of %3d %9.3f ns\t%10d ns\t(%30.10f) '%s'\n",
553 static_cast<int>(i + 1),
555 (timer.
time() * 1000000000.0) / (1.0 *
rounds),
556 static_cast<int>(timer.
time() * 1000000000.0),
557 static_cast<double>(sum),
558 expr_str_list[i].c_str());
562 single_eval_total_time += (timer.
time() * 1000000000.0) / (1.0 *
rounds);
567 printf(
"[*] Number Of Evals: %15.0f\n",
570 printf(
"[*] Total Time: %9.3fsec\n",
573 printf(
"[*] Total Single Eval Time: %9.3fms\n",
574 static_cast<double>(single_eval_total_time / 1000000.0));
bool register_symbol_table(symbol_table< T > &st)
bool compile(const std::string &expression_string, expression< T > &expr)
std::string error() const
bool add_variable(const std::string &variable_name, T &t, const bool is_constant=false)
static const std::size_t rounds
const std::size_t expression_list_size
void perform_file_based_benchmark(const std::string &file_name, const std::size_t &rounds=100000)
static const real::type upper_bound_y
bool run_parse_benchmark(exprtk::symbol_table< T > &symbol_table)
static const double upper_bound_y_d
std::size_t load_expression_file(const std::string &file_name, std::deque< std::string > &expression_list)
static const double lower_bound_y_d
void run_exprtk_benchmark(T &x, T &y, exprtk::expression< T > &expression, const std::string &expr_string)
void run_native_benchmark(T &x, T &y, NativeFunction f, const std::string &expr_string)
static const std::string expression_list[]
static const double delta_d
static const double lower_bound_x_d
static const double upper_bound_x_d
static const real::type lower_bound_y
static const real::type delta
bool load_expression(exprtk::symbol_table< T > &symbol_table, Sequence< exprtk::expression< T >, Allocator > &expr_seq)
static const real::type upper_bound_x
static const real::type lower_bound_x
static T func06(Type x, Type y)
static T func09(Type x, Type y)
static T func16(Type x, Type y)
static T func11(Type x, Type y)
static T func10(Type x, Type y)
static T func08(Type x, Type y)
static T func12(Type x, Type y)
static T func04(Type x, Type y)
static T clamp(const Type l, const Type v, const Type u)
static T func02(Type x, Type y)
exprtk::details::functor_t< T > functor_t
static T func15(Type x, Type y)
static T func00(Type x, Type y)
static T func03(Type x, Type y)
static T func13(Type x, Type y)
static T func07(Type x, Type y)
static T avg(Type x, Type y)
static T func05(Type x, Type y)
static T func14(Type x, Type y)
static T func01(Type x, Type y)