34 "((1.23 * x^2) / y) - 123.123",
35 "(y + x / y) * (x - y / x)",
36 "x / ((x + y) + (x - y)) / y",
37 "1 - ((x * y) + (y / x)) - 3",
38 "(5.5 + x) + (2 * x - 2 / 3 * y) * (x / 3 + y / 4) + (y + 7.7)",
39 "1.1x^1 + 2.2y^2 - 3.3x^3 + 4.4y^15 - 5.5x^23 + 6.6y^55",
40 "sin(2 * x) + cos(pi / y)",
41 "1 - sin(2 * x) + cos(pi / y)",
42 "sqrt(111.111 - sin(2 * x) + cos(pi / y) / 333.333)",
43 "(x^2 / sin(2 * pi / y)) - x / 2",
44 "x + (cos(y - sin(2 / x * pi)) - sin(x - cos(2 * y / pi))) - y",
45 "clamp(-1.0, sin(2 * pi * x) + cos(y / 2 * pi), +1.0)",
46 "max(3.33, min(sqrt(1 - sin(2 * x) + cos(pi / y) / 3), 1.11))",
47 "if((y + (x * 2.2)) <= (x + y + 1.1), x - y, x * y) + 2 * pi / x"
61 template <
typename,
typename>
class Sequence>
74 printf(
"[load_expression] - Parser Error: %s\tExpression: %s\n",
75 parser.
error().c_str(),
81 expr_seq.push_back(expression);
90 const std::string& expr_string)
93 unsigned int count = 0;
102 total += expression.
value();
110 printf(
"[exprtk] Total Time:%12.8f Rate:%14.3fevals/sec Expression: %s\n",
112 count / timer.
time(),
113 expr_string.c_str());
115 printf(
"run_exprtk_benchmark() - Error running benchmark for expression: %s\n",expr_string.c_str());
118template <
typename T>
struct native;
120template <
typename T,
typename NativeFunction>
124 unsigned int count = 0;
141 printf(
"[native] Total Time:%12.8f Rate:%14.3fevals/sec Expression: %s\n",
143 count / timer.
time(),
144 expr_string.c_str());
146 printf(
"run_native_benchmark() - Error running benchmark for expression: %s\n",expr_string.c_str());
152 static const std::size_t
rounds = 100000;
163 for (std::size_t r = 0; r <
rounds; ++r)
167 printf(
"[run_parse_benchmark] - Parser Error: %s\tExpression: %s\n",
168 parser.
error().c_str(),
177 printf(
"[parse] Total Time:%12.8f Rate:%14.3fparse/sec Expression: %s\n",
186const double pi = 3.141592653589793238462643383279502;
196 return (x + y) / T(2);
201 return ((v < l) ? l : ((v > u) ? u : v));
211 return T(2) * (y + x);
216 return (T(2) * y + T(2) * x);
221 return ((T(1.23) * (x * x)) / y) - T(123.123);
226 return (y + x / y) * (x - y / x);
231 return x / ((x + y) + (x - y)) / y;
236 return T(1) - ((x * y) + (y / x)) - T(3);
241 return (T(5.5) + x) + (T(2) * x - T(2) / T(3) * y) * (x / T(3) + y / T(4)) + (y + T(7.7));
247 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)));
252 return std::sin(T(2) * x) + std::cos(
pi / y);
257 return T(1) - std::sin(T(2) * x) + std::cos(
pi / y);
262 return std::sqrt(T(111.111) - std::sin(T(2) * x) + std::cos(
pi / y) / T(333.333));
267 return ((x * x) / std::sin(T(2) *
pi / y)) - x / T(2);
272 return (x + (std::cos(y - std::sin(T(2) / x *
pi)) - std::sin(x - std::cos(T(2) * y /
pi))) - y);
277 return clamp(T(-1), std::sin(T(2) *
pi * x) + std::cos(y / T(2) *
pi), + T(1));
282 return std::max(T(3.33), std::min(sqrt(T(1) - std::sin(T(2) * x) + std::cos(
pi / y) / T(3)), T(1.11)));
287 return (((y + (x * T(2.2))) <= (x + y + T(1.1))) ? x - y : x * y) + T(2) *
pi / x;
294int main(
int argc,
char* argv[])
298 const std::string file_name = argv[1];
318 std::deque<exprtk::expression<double> > compiled_expr_list;
326 printf(
"--- EXPRTK ---\n");
327 for (std::size_t i = 0; i < compiled_expr_list.size(); ++i)
334 printf(
"--- NATIVE ---\n");
355 printf(
"--- PARSE ----\n");
368 static const double delta = 0.07;
401 std::ifstream stream(file_name.c_str());
403 if (!stream)
return 0;
406 buffer.reserve(1024);
407 std::size_t line_count = 0;
409 while (std::getline(stream,buffer))
413 else if (
'#' == buffer[0])
425 std::deque<std::string> expr_str_list;
429 printf(
"Failed to load any expressions from: %s\n", file_name.c_str());
439 symbol_table_t symbol_table;
451 symbol_table.add_variable(
"a", a);
452 symbol_table.add_variable(
"b", b);
453 symbol_table.add_variable(
"c", c);
455 symbol_table.add_variable(
"x", x);
456 symbol_table.add_variable(
"y", y);
457 symbol_table.add_variable(
"z", z);
458 symbol_table.add_variable(
"w", w);
473 symbol_table.add_function(
"poly01", poly01);
474 symbol_table.add_function(
"poly02", poly02);
475 symbol_table.add_function(
"poly03", poly03);
476 symbol_table.add_function(
"poly04", poly04);
477 symbol_table.add_function(
"poly05", poly05);
478 symbol_table.add_function(
"poly06", poly06);
479 symbol_table.add_function(
"poly07", poly07);
480 symbol_table.add_function(
"poly08", poly08);
481 symbol_table.add_function(
"poly09", poly09);
482 symbol_table.add_function(
"poly10", poly10);
483 symbol_table.add_function(
"poly11", poly11);
484 symbol_table.add_function(
"poly12", poly12);
486 symbol_table.add_package(vector_package);
490 symbol_table.add_variable(
"e", e,
true);
492 symbol_table.add_constants();
497 for (std::size_t i = 0; i < expr_str_list.size(); ++i)
499 expression_t expression;
500 expression.register_symbol_table(symbol_table);
502 if (!parser.compile(expr_str_list[i],expression))
504 printf(
"[perform_file_based_benchmark] - Parser Error: %s\tExpression: %s\n",
505 parser.error().c_str(),
506 expr_str_list[i].c_str());
518 double single_eval_total_time = 0.0;
537 for (std::size_t r = 0; r <
rounds; ++r)
539 sum += expression.value();
546 printf(
"Expression %3d of %3d %9.3f ns\t%10d ns\t(%30.10f) '%s'\n",
547 static_cast<int>(i + 1),
549 (timer.
time() * 1000000000.0) / (1.0 *
rounds),
550 static_cast<int>(timer.
time() * 1000000000.0),
552 expr_str_list[i].c_str());
556 single_eval_total_time += (timer.
time() * 1000000000.0) / (1.0 *
rounds);
561 printf(
"[*] Number Of Evals: %15.0f\n",
564 printf(
"[*] Total Time: %9.3fsec\n",
567 printf(
"[*] Total Single Eval Time: %9.3fms\n",
568 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)
const std::string global_expression_list[]
void perform_file_based_benchmark(const std::string &file_name, const std::size_t &rounds=100000)
static const double global_upper_bound_y
static const double global_lower_bound_x
bool run_parse_benchmark(exprtk::symbol_table< T > &symbol_table)
std::size_t load_expression_file(const std::string &file_name, std::deque< std::string > &expression_list)
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 double global_delta
bool load_expression(exprtk::symbol_table< T > &symbol_table, Sequence< exprtk::expression< T >, Allocator > &expr_seq)
static const double global_lower_bound_y
const std::size_t global_expression_list_size
static const double global_upper_bound_x
static const std::size_t rounds
static const double upper_bound_y
static const double upper_bound_x
static const double delta
static const double lower_bound_x
static const double lower_bound_y
static const std::string expression_list[]
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)