using System.Diagnostics;
using System.Collections.Generic;
using CodingSeb.ExpressionEvaluator;
public static void Main()
int helloWorldValue = 48;
string expression = "Set(hello_world, asdf)";
ExpressionEvaluator evaluator = new ExpressionEvaluator();
evaluator.OptionVariablesPersistenceCustomComparer = true;
evaluator.OptionInstanceMethodsCallActive = false;
evaluator.OptionPropertyOrFieldSetActive = false;
evaluator.OptionDetectExtensionMethodsOverloadsOnExtensionMethodNotFound = false;
evaluator.OptionNewKeywordEvaluationActive = false;
evaluator.Variables = new Dictionary<string, object> () { {"hello_world", helloWorldValue} };
evaluator.PreEvaluateVariable += delegate (object sender, VariablePreEvaluationEventArg e)
evaluator.PreEvaluateFunction += delegate (object sender, FunctionPreEvaluationEventArg e)
object result = e.Evaluator.Evaluate(e.Args[1]);
e.Evaluator.Variables[e.Args[0].Trim()] = result;
object? lastResult = null;
Stopwatch stopWatch = new Stopwatch();
evaluator.Evaluate(expression);
for (int i = 0; i < iterations; ++i)
lastResult = evaluator.Evaluate(expression);
Console.WriteLine($"evaluation of {iterations} times reusing evaluator took: {stopWatch.ElapsedMilliseconds} ms ({stopWatch.Elapsed.TotalMicroseconds / (double)iterations} us / iteration)");
Console.WriteLine($"last result: {lastResult}");
for (int i = 0; i < iterations; ++i)
ExpressionEvaluator newEvaluator = new ExpressionEvaluator();
newEvaluator.OptionVariablesPersistenceCustomComparer = true;
newEvaluator.Variables = new Dictionary<string, object> () { {"hello_world", helloWorldValue} };
newEvaluator.PreEvaluateVariable += delegate (object sender, VariablePreEvaluationEventArg e)
newEvaluator.PreEvaluateFunction += delegate (object sender, FunctionPreEvaluationEventArg e)
object result = e.Evaluator.Evaluate(e.Args[1]);
e.Evaluator.Variables[e.Args[0].Trim()] = result;
lastResult = newEvaluator.Evaluate(expression);
Console.WriteLine($"evaluation of {iterations} times with new evaluator each time took: {stopWatch.ElapsedMilliseconds} ms ({stopWatch.Elapsed.TotalMicroseconds / (double)iterations} us / iteration)");
Console.WriteLine($"last result: {lastResult}");
var exprTest = new Expression("hello_world");
for (int i = 0; i < iterations; ++i)
var expr = new Expression(expression);
expr.EvaluateParameter += delegate(string name, ParameterArgs args)
expr.Functions["Set"] = (args) => {
object result = args[1].Evaluate();
expr.Parameters[args[0].ToString()] = args[1].Evaluate();
expr.Parameters["hello_world"] = helloWorldValue;
lastResult = expr.Evaluate();
Console.WriteLine($"evaluation of {iterations} times with ncalc (and new expression) took: {stopWatch.ElapsedMilliseconds} ms ({stopWatch.Elapsed.TotalMicroseconds / (double)iterations} us / iteration)");
Console.WriteLine($"last result: {lastResult}");
var reused = new Expression(expression);
var variables = new Dictionary<string, object>() { {"asdf", asdfValue} };
reused.EvaluateParameter += delegate(string name, ParameterArgs args)
args.Result = variables["asdf"];
reused.Functions["Set"] = (args) => {
object result = args[1].Evaluate();
for (int i = 0; i < iterations; ++i)
reused.Parameters["hello_world"] = helloWorldValue;
lastResult = reused.Evaluate();
Console.WriteLine($"reused[\"hello_world\"] = {reused.Parameters["hello_world"]}");
Console.WriteLine($"evaluation of {iterations} times with ncalc (and reused expression) took: {stopWatch.ElapsedMilliseconds} ms ({stopWatch.Elapsed.TotalMicroseconds / (double)iterations} us / iteration)");
Console.WriteLine($"last result: {lastResult}");