¿Por qué Func <> se crea a partir de Expression <Func <>> más lento que Func <> declarado directamente?

¿Por qué es unFunc<> creado a partir de unExpression<Func<>> a través de .Compile () considerablemente más lento que simplemente usando unFunc<> declarado directamente?

Acabo de cambiar de usar unFunc<IInterface, object> declarado directamente a uno creado a partir de unExpression<Func<IInterface, object>> en una aplicación en la que estoy trabajando y noté que el rendimiento bajó.

Acabo de hacer una pequeña prueba, y elFunc<> creado a partir de una expresión toma "casi" el doble del tiempo de unFunc<> declarado directamente.

En mi máquina el directoFunc<> tarda unos 7,5 segundos y elExpression<Func<>> Tarda unos 12,6 segundos.

Aquí está el código de prueba que utilicé (ejecutando Net 4.0)

// Direct
Func<int, Foo> test1 = x => new Foo(x * 2);

int counter1 = 0;

Stopwatch s1 = new Stopwatch();
s1.Start();
for (int i = 0; i < 300000000; i++)
{
 counter1 += test1(i).Value;
}
s1.Stop();
var result1 = s1.Elapsed;



// Expression . Compile()
Expression<Func<int, Foo>> expression = x => new Foo(x * 2);
Func<int, Foo> test2 = expression.Compile();

int counter2 = 0;

Stopwatch s2 = new Stopwatch();
s2.Start();
for (int i = 0; i < 300000000; i++)
{
 counter2 += test2(i).Value;
}
s2.Stop();
var result2 = s2.Elapsed;



public class Foo
{
 public Foo(int i)
 {
  Value = i;
 }
 public int Value { get; set; }
}
¿Cómo puedo recuperar el rendimiento?

¿Hay algo que pueda hacer para obtener elFunc<> creado a partir deExpression<Func<>> actuar como uno declarado directamente?

Respuestas a la pregunta(6)

Su respuesta a la pregunta