Tengo un escenario simple, en el que intento probar el rendimiento de un árbol compilado de expresiones en una lista de objetos de stock. Debajo está el códigoRendimiento del árbol de expresiones compilado
El rendimiento del árbol compilado de expresión es 5 veces más lento que la llamada lambda estática. No estoy seguro de si este es un rendimiento estándar que uno puede esperar con el árbol compilado de expresiones. Agradecería cualquier idea.
LambdaExpression();
List<Stock> stocks = new List<Stock>();
for (int ctr = 0; ctr <= 5000000; ctr++)
{
Stock stk1 = new Stock() { Price = ctr, Symbol = "A", CloseDate = DateTime.Now, FaceValue = ctr } ;
stocks.Add(stk1);
}
CompileTimeLamda(a);
DynamicLambda(a);
public static void LambdaExpression()
{
ParameterExpression CS1 = Expression.Parameter(typeof(Stock), "d");
var line1 = Expression.Equal(Expression.Property(CS1, typeof(Stock).GetProperty("Symbol")), Expression.Constant("MSFT", typeof(string)));
var line2 = Expression.GreaterThan(Expression.Property(Expression.Property(CS1, typeof(Stock).GetProperty("CloseDate")),typeof(DateTime).GetProperty("Millisecond")),
Expression.Constant(0, typeof(int)));
var line3 = Expression.GreaterThan(Expression.Property(CS1, typeof(Stock).GetProperty("Price")), Expression.Constant((double)0, typeof(double)));
var line4 = Expression.And(line1,line2);
var line5 = Expression.OrElse(line4, line3);
func = Expression.Lambda<Func<Stock, bool>>(line5, new ParameterExpression[] { CS1 }).Compile();
}
public static void DynamicLambda(List<Stock> stks)
{
Stopwatch watch = new Stopwatch();
watch.Start();
foreach (var d in stks)
{
func(d);
}
watch.Stop();
Console.WriteLine("Dynamic Lambda :" + watch.ElapsedMilliseconds);
}
public static void CompileTimeLamda(List<Stock> stks)
{
Stopwatch watch = new Stopwatch();
watch.Start();
foreach (var d in stks)
{
if (d.Symbol == "MSFT" && d.CloseDate.Millisecond > 0 ||
(d.Price) > 0) ;
}
watch.Stop();
Console.WriteLine("Compile Time Lamda " +watch.ElapsedMilliseconds);
}
Compruebe la IL compilada; el optimizador puede estar matando a todo tu código. – SLaks
En realidad, no está comparando 2 expresiones lambda. El segundo es solo código compilado, es decir, no delegado. Es muy posible que el delegado sea lo que lo hace más lento. – MikeKulls
Parece que está comparando manzanas y naranjas. El "tiempo de compilación lambda" no usa una lambda en absoluto. Además, el compilador probablemente está optimizando el bucle porque realmente no estás haciendo nada (instrucción vacía ";") –