expressions - C#¿Lambda=> genera basura?
lambda expressions c# (2)
¿El uso de una expresión lambda genera basura para el GC en oposición al bucle foreach normal?
// Lambda version
Foos.ForEach(f=>f.Update(gameTime));
// Normal approach:
foreach (Foo f in Foos)
{
f.Update(gameTime);
}
El generador de perfiles CLR muestra que tengo 69.9% de sistema. Acción <T> y sospecho que es la versión lamba del bucle foreach como se indicó anteriormente. ¿Es eso cierto?
EDITAR: utilicé el perfil de Microsoft CLR: http://download.microsoft.com/download/4/4/2/442d67c7-a1c1-4884-9715-803a7b485b82/clr%20profiler.exe o http://msdn.microsoft.com/en-us/library/ff650691.aspx
En este caso, creo que está usando un método genérico (ForEach) que generará un nuevo tipo (asumiendo que Foo es un tipo de referencia, solo se generará un nuevo tipo), y la lambda se compilará como un método anónimo regular . Nada de eso sugiere ningún tipo de aumento lineal en el uso de la memoria.
En lo que respecta al generador de perfiles, no está midiendo nada sobre la memoria o el GC. Está midiendo el tiempo empleado en la ejecución del método, y la lambda no debe ser significativamente más lenta que la forma "normal".
Sí, un lambda creará basura si el cierre captura una variable del ámbito local (es decir, tiempo de gameTime
en este contexto).
Por ejemplo, la siguiente función de C #:
static void TestLambda(List<Foo> Foos, DateTime gameTime)
{
Foos.ForEach(f => f.Update(gameTime));
}
Será traducido a esto:
private static void TestLambda(List<Foo> Foos, DateTime gameTime)
{
Program.<>c__DisplayClass1 <>c__DisplayClass = new Program.<>c__DisplayClass1();
<>c__DisplayClass.gameTime = gameTime;
Foos.ForEach(new Action<Foo>(<>c__DisplayClass.<TestLambda>b__0));
}
Tenga en cuenta que hay dos instancias de new
en el código resultante, lo que significa que no solo se asignan objetos de Action
(los cierres), sino también objetos para contener las variables capturadas (registros de variables de escape).