¿Cuál es el “costo” de la reflexión .NET?

Posible duplicado:
¿Qué tan costoso es la reflexión de .NET?

Actualmente estoy en una mentalidad de progtwigción que el reflection es mi mejor amigo. Lo uso mucho para la carga dinámica de contenido que permite una “implementación flexible” en lugar de interfaces estrictas, así como una gran cantidad de atributos personalizados.

¿Cuál es el costo “real” para usar la reflexión?

¿Vale la pena el esfuerzo de los tipos reflejados con frecuencia para tener reflections en caché, como nuestro propio código de objeto DAL pre-LINQ en todas las propiedades de las definiciones de tabla?

¿La memoria de almacenamiento en caché superará el uso de la CPU de reflexión?

La reflexión requiere una gran cantidad de metadatos de tipo para ser cargados y luego procesados. Esto puede provocar una sobrecarga de memoria más grande y una ejecución más lenta. Según este artículo , la modificación de la propiedad es aproximadamente 2.5x-3x más lenta y la invocación del método es 3.5x-4x más lenta.

Aquí hay un excelente artículo de MSDN que describe cómo hacer que la reflexión sea más rápida y dónde está la sobrecarga. Recomiendo leer si quieres saber más.

También hay un elemento de complejidad que la reflexión puede agregar al código que lo hace sustancialmente más confuso y, por lo tanto, más difícil de trabajar. Algunas personas, como Scott Hanselman, creen que al usar la reflexión a menudo se generan más problemas de los que se resuelven. Este es especialmente el caso si sus equipos son en su mayoría desarrolladores junior.

Puede ser mejor que busque en el DLR (Dynamic Language Runtime) si necesita mucho comportamiento dynamic. Con los nuevos cambios que vienen en .NET 4.0, es posible que desee ver si puede incorporar algo de eso en su solución. El soporte adicional para la dinámica de VB y C # hace que el uso del código dynamic sea muy elegante y la creación de sus propios objetos dynamics bastante sencillo.

Buena suerte.

EDITAR: Hice un poco más hurgando en el sitio de Scott y encontré este podcast en la reflexión. No lo escuché, pero podría valer la pena.

Hay muchas cosas que puedes hacer para acelerar la reflexión. Por ejemplo, si está haciendo un montón de acceso a la propiedad, entonces HyperDescriptor podría ser útil.

Si realiza una gran cantidad de invocación de método, puede almacenar en caché los métodos para delegates tipeados mediante Delegate.CreateDelegate ; esto hace que la verificación de tipo, etc. solo una vez (durante CreateDelegate ).

Si realiza una gran cantidad de construcción de objetos, Delegate.CreateDelegate no lo ayudará (no puede usarlo en un constructor), pero (en 3.5) Expression puede usarse para hacer esto, comstackndo de nuevo a un delegado tipeado.

Entonces sí, la reflexión es lenta, pero puedes optimizarla sin demasiado dolor.

Con un gran poder viene una gran responsabilidad.

Como dices, la reflexión tiene costos asociados y, dependiendo de la cantidad de reflexión que hagas, puede ralentizar significativamente la aplicación.

Uno de los lugares más adecuados para usarlo es para IoC (Inversión de control) ya que, dependiendo del tamaño de su aplicación, probablemente tendría más beneficios que no.

Gracias por los excelentes enlaces y excelentes comentarios, especialmente por parte de Jr Devs, que dieron en el clavo.

Para nosotros es más fácil para nuestros desarrolladores junior hacer esto:

 [TableName("Table")] public class SomeDal : BaseDal { [FieldName("Field")] public string Field } 

en lugar de algunas mayores impelementaciones de DAL. Esto acelera su construcción de los objetos DAL, a la vez que oculta todo el funcionamiento interno para que los desarrolladores sénior lo destruyan.

Lástima que LINQ no salió antes, siento que a veces escribimos la mitad.

Una cosa que a veces puede morderte cuando usas la reflexión no es actualizar las llamadas usando la reflexión al hacer la refactorización. Herramientas como resharper le solicitarán que actualice los comentarios y las cadenas cuando cambie el nombre de un método, de modo que pueda captar la mayoría de ellos de esa manera, pero cuando llame a métodos que se generaron dinámicamente o se generó dinámicamente el nombre del método, es posible que perder algo

La única solución es una buena documentación y pruebas unitarias exhaustivas.