using System.Linq.Expressions;
using System.Diagnostics;
public static int Multiply(int x) { return x * 5; }
public static void Main()
ParameterExpression parameter = Expression.Parameter(typeof(int), "x");
BinaryExpression multiplication = Expression.Multiply(parameter, Expression.Constant(5));
LambdaExpression lambda = Expression.Lambda(multiplication, parameter);
Func<int, int> multiplyByFive = (Func<int, int>)lambda.Compile();
Stopwatch watch = new Stopwatch();
for (int i = 0; i < 1000000; i++)
multiplyByFive.Invoke(10);
Console.WriteLine("Invoke: " + watch.ElapsedMilliseconds + "ms");
Stopwatch watch2 = new Stopwatch();
for (int i = 0; i < 1000000; i++)
multiplyByFive.DynamicInvoke(10);
Console.WriteLine("DynamicInvoke: " + watch2.ElapsedMilliseconds + "ms");
multiplyByFive = Multiply;
Stopwatch watch3 = new Stopwatch();
for (int i = 0; i < 1000000; i++)
multiplyByFive.Invoke(10);
Console.WriteLine("Invoke(pre-compiled): " + watch3.ElapsedMilliseconds + "ms");
Stopwatch watch4 = new Stopwatch();
for (int i = 0; i < 1000000; i++)
multiplyByFive.DynamicInvoke(10);
Console.WriteLine("DynamicInvoke(pre-compiled): " + watch4.ElapsedMilliseconds + "ms");