2010-06-02 15 views
8

He comenzado a utilizar mucho delegados anónimos en C# y he empezado a preguntarme qué tan eficiente es el compilador o el tiempo de ejecución para eliminarlos del código que realmente se ejecuta y no lo he visto en detalle en ningún lugar ?Optimizador del compilador delegado C#

¿Es lo suficientemente inteligente como para alinearlos y colapsar los usos recursivos que se pueden deducir estáticamente?

+3

¿Puede proporcionarnos un ejemplo de caso que le gustaría optimizar? – SLaks

+1

Dudo que el * compilador * haga algo para eliminarlos. El JITer, sin embargo, puede realizar una variedad de optimizaciones, que pueden incluir la inclusión de tales funciones. – LBushkin

+0

Sin embargo, creo que el JITer no incluirá delegados. – SLaks

Respuesta

3

No el compilador de C# no optimizará una expresión lambda en código en línea. Delegados anónimos y expresiones lambda siempre producirán un delegado correspondiente o un árbol de expresiones. Esto se trata en la sección 6.5 de la especificación de lenguaje C#

Una expresión-método-anónima o expresión-lambda se clasifica como una función anónima (§7.14). La expresión no tiene un tipo pero se puede convertir implícitamente a un tipo de árbol de expresión o tipo de delegado compatible

En algunos casos, la lambda se almacenará en caché y no se volverá a crear para usar en el futuro. Pero no será inline.

+0

Pero lo que usted citó realmente significa que no lo harán, como me parece más conceptualmente cómo deberían comportarse desde la vista de los usuarios, no qué Optimizador puede ser capaz de hacer a sus espaldas? – iam

+0

@wb, no lo dice directamente pero es un requisito. Para ser utilizado, una función anónima debe convertirse en un delegado. Los delegados son tipos de primera clase en .Net y pueden ser reemplazados hacer cualquier cosa en invocar. Si el compilador de C# incluía un delegado, podría omitir un DynamicInvokeImpl definido por el usuario que rompería el comportamiento, por lo tanto, no puede alinearlos. – JaredPar

2

En la mayoría de los casos, no, no lo es.

Sin embargo, a menos que esté notando problemas de rendimiento reales y los haya rastreado en un generador de perfiles, no debe preocuparse por ello.

2

El compilador de C# nunca los optimizará. Sin embargo, el compilador .NET JIT podría ser lo suficientemente simple.